Stop arguing. Let's have them all. They all have different semantic values that are handy.
Old guys: setTimeout === I don't care when these will happen, just that they will happen eventually, sometime later. I don't care about their order. I also want to keep a reference, in case I want to cancel them. nextTick === I want the stuff I call to run first on the next tick, in the order I called them. I'm never gonna need to cancel these. New guys: setImmediate === Similar to nextTick but with a reference, so I may cancel it during this tick, or within an afterTick/nextTick call. afterTick === Before jumping to the next tick, and after this tick has ran to completion, run these in order. In perspective: tick...nextTick stuff...setImmediate stuff...everything else I don't care about their order, setTimeouts, events etc...afterTick stuff...tick..... --stagas 2012/5/31 Jorge <jo...@jorgechamorro.com>: > If there are bugs in node's internal libraries/code due to nextTick()'s > current behaviour, they can simply rewrite nextTick() as they please into a > *new* method with a *different* name such as e.g. thisTick, and do an > s/nextTick/thisTick/g onto node's source code and that's it. > > But there's no need to touch (such an essential piece of) node's public API > (and fuck all its users and their programs) to fix node's internal bugs. > -- > Jorge. > > On May 31, 2012, at 10:50 AM, James Howe wrote: > >> The git issue now has good examples of why something higher-priority and >> something lower-priority than the current nextTick compromise are desired. >> As long as not just the higher-priority one is provided, I'll be happy. >> >> On Wednesday, 30 May 2012 15:33:20 UTC+1, Tim Caswell wrote: >> >> >> On Wed, May 30, 2012 at 4:12 AM, James Howe <ja...@howeswho.co.uk> wrote: >> Sorry if I'm being obtuse, but why do you need a special API for >> Do-Work-After-Run-To-Completion? Can that not be achieved just with normal >> program flow-control (i.e. do the work, do the thing after the work, return)? >> >> No. It's impossible to do anything after returning using normal >> control-flow. A perfect example is a function that returns an event >> emitter. The code that attaches event listeners to the emitter *can't* >> attach listeners till you return the emitter. But there are times that you >> want to emit events as soon as possible. nextTick tells node to call your >> function after your caller returns and the whole stack unwinds. >> >> >> Further to my assumptions (and experience) about what nextTick does, it >> seemed obvious to me that you need to set the handlers before you returned >> from the stack to avoid missing data events. Setting them before returning >> doesn't cause any problems, as those events can't be processed until you've >> returned anyway. >> >> And to Mikeal, I have quite sizeable projects that would go wrong if >> nextTick semantics are changed (and we don't find some way to fix them) but >> haven't posted examples because they are a) sizeable, b) closed-source and >> c) I don't have time. >> >> Are you cases where you depend on the current implementation of nextTick >> easy to work around? I know I have tons of code that depends on the current >> behavior, but in every case I could modify my code to not depend on the >> behavior. >> >> Everyone, please read the thread in the gist that Isaac posted. There are >> several proposed new APIs that make it possible to do low-priority work that >> doesn't starve/block the event loop. >> >> >> Regards >> >> >> On Wednesday, 30 May 2012 04:21:58 UTC+1, CrabDude wrote: >> There seem to be 2 considerations: >> >> 1. Adding sameTick() functionality to node. >> 2. Whether nextTick() should house that behavior, or another API / name. >> >> FWIW, I always misunderstood process.nextTick() to occur, as the name >> implies, at the beginning of the next tick. In other words, the name implied >> to me that it would yield to any queued timer / IO events, and then execute >> at the beginning of the next event loop. In fact, b/c of this >> misunderstanding, I found nextTick() and setImmediate() to be eventually >> redundant. >> >> I feel fairly confident in saying that it would be easier for core to >> implement the desired behavior under a different name (sameTick(), etc...) >> and replace all calls to nextTick() with sameTick(), thisTick(), etc..., >> than to change the misperceptions others may have regarding what the >> function name implies, that it in fact actually does not execute until the >> _next_ tick. Changing the behavior of nextTick to something that conflicts >> with its name, would seem to inevitably cause misunderstandings. Core >> obviously (from this thread) though has a different perception of the >> purpose of nextTick, since it seems it has a very specific purpose for which >> it was created and is used. Ironically, those most familiar with its >> *intended purpose* are also those that are most aware that its >> implementation is not always consistent with that purpose. >> >> Is there any reasoning core has regarding why replacing all nextTick() calls >> with thisTick() would be problematic? It is after all new functionality, and >> once again the name nextTick() seems inconsistent with its proposed new >> implementation. >> >> Wouldn't nextTick inevitably be deprecated / replaced by setImmediate >> anyways? It's too bad too, nexTick() is a great name, much nicer than >> "sameTick," "thisTick," etc... >> >> Cheers, >> Adam Crabtree >> >> On Tue, May 29, 2012 at 4:28 PM, Marco Rogers wrote: >> >> The problem with this characterization of the API's history is that it's >> actually not distinguishable from setTimeout(fn, 0) except in >> implementation. As described, they are for quite literally the same thing >> although one of them is a little better at it because of an implementation >> detail. If this characterization is true (i don't believe it is) then we >> should re-purpose or remove nextTick() and improve the performance of >> setTimeout(fn,0). I'm not suggesting that is what we do, but it's the >> logical conclusion to this characterization. >> >> >> This characterization comes from people's real impressions of nextTick. If >> you want to change that impression, you have some work to do. >>> >>> As for whether it's valid to use nextTick or setTimeout or whatever to >>> break up computation, that's not your call. >> >> Are you saying that core can't state the intention of an API? That's insane. >> >> Core is free to change the implementation details and semantics of an API at >> any time, and has on many occasions. This is always done with the intention >> of making it *better*. In order to characterize what is "better" the API >> must have a purpose and that has always been dictated by core (Ryan and then >> Isaac). >> >> As for the purpose of nextTick, I did agree on what the intended purpose >> was. And yes you can change whatever you want. You guys are in charge. And >> we're free to tell you it was a bad idea. You're free to get mad about that. >> And we're free to tell you you're being kind of bratty about it. Everybody's >> free! The only problem here is that you think you're allowed to think you're >> right more than we're allowed to think you're wrong. Strange isn't it? >> >> Let me be clear. I think the problem with missing data events should be >> fixed. But we should evaluate the solutions to make sure they aren't going >> to cause follow on problems that will haunt us. That's what I'm doing here. >> If you don't agree about follow on problems, say that. If you don't want to >> discuss potential follow on problems, say that. If you want to be upset that >> not everybody who uses node has the exact same view of it's affordances as >> you do... well I don't know how to help you with that. >> >> Instead, we got a lot of comments about names and about theoretical breakage >> in code without anyone noting running code that actually breaks or is even >> valid. And now we're being taken down the rabbit hole of "I can't use this >> for something it wasn't designed for". >> >> >> So since a hand full of people who saw this message and decided to respond >> don't have concrete use cases in hand ready to go, you can dismiss all >> concerns? That's crap. We *should* find some use cases, but that doesn't >> mean the discussion here isn't useful or that we can't reason about what >> might happen. Reasoning about semantics is how programming works. Or at >> least that's usually how I do it. >> >> The way in which people are providing feedback to this proposed changed is >> unproductive because they do not recognize the reality of the current >> semantics. >> 1) that we cannot remove nextTick() and it is heavily relied on. >> 2) that much of the code that *currently* relies on nextTick() breaks under >> heavy load because of the current implementation. >> >> All of this feedback is "me too". It's statements of opinion without >> reference the problem that must be solved. >> >> There's some truth to this. As I said, the problem to be solved is >> important. But pretending it's the only thing that's important and that >> there isn't potential to cause other problems is ludicrous. Also ludicrous >> is bullying and yelling at people who came here to discuss things with you >> in good faith precisely because we care deeply about node and the direction >> it goes in. Try to get some perspective here man. Also try meditation. >> >> >> The intention of feedback should be to change the minds of those that >> proposed the change, not to prove that your'e right under your terms. >> >> I don't think that's what anyone here has done. I even started out by saying >> I may need to be educated about this. But I also think you and other core >> guys are sometimes obtuse and dismissive about how non-core people actually >> build their mental model about node execution and how that affects the >> solutions they come up with. I'm not giving you *my* terms. I'm giving you >> the terms I've gotten from talking to a lot of people who are not node >> experts. And as much as node benefits from not having the baggage of >> traditional notions of i/o, it does have the baggage of people's long >> experience with javascript execution. You can ignore that useful data at >> your peril. >> >> :Marco >> >> -- >> Marco Rogers >> >> Life is ten percent what happens to you and ninety percent how you respond >> to it. >> - Lou Holtz >> >> >> >> -- >> Better a little with righteousness >> than much gain with injustice. >> Proverbs 16:8 >> >> On Wednesday, 30 May 2012 04:21:58 UTC+1, CrabDude wrote: >> There seem to be 2 considerations: >> >> 1. Adding sameTick() functionality to node. >> 2. Whether nextTick() should house that behavior, or another API / name. >> >> FWIW, I always misunderstood process.nextTick() to occur, as the name >> implies, at the beginning of the next tick. In other words, the name implied >> to me that it would yield to any queued timer / IO events, and then execute >> at the beginning of the next event loop. In fact, b/c of this >> misunderstanding, I found nextTick() and setImmediate() to be eventually >> redundant. >> >> I feel fairly confident in saying that it would be easier for core to >> implement the desired behavior under a different name (sameTick(), etc...) >> and replace all calls to nextTick() with sameTick(), thisTick(), etc..., >> than to change the misperceptions others may have regarding what the >> function name implies, that it in fact actually does not execute until the >> _next_ tick. Changing the behavior of nextTick to something that conflicts >> with its name, would seem to inevitably cause misunderstandings. Core >> obviously (from this thread) though has a different perception of the >> purpose of nextTick, since it seems it has a very specific purpose for which >> it was created and is used. Ironically, those most familiar with its >> *intended purpose* are also those that are most aware that its >> implementation is not always consistent with that purpose. >> >> Is there any reasoning core has regarding why replacing all nextTick() calls >> with thisTick() would be problematic? It is after all new functionality, and >> once again the name nextTick() seems inconsistent with its proposed new >> implementation. >> >> Wouldn't nextTick inevitably be deprecated / replaced by setImmediate >> anyways? It's too bad too, nexTick() is a great name, much nicer than >> "sameTick," "thisTick," etc... >> >> Cheers, >> Adam Crabtree >> >> On Tue, May 29, 2012 at 4:28 PM, Marco Rogers wrote: >> >> The problem with this characterization of the API's history is that it's >> actually not distinguishable from setTimeout(fn, 0) except in >> implementation. As described, they are for quite literally the same thing >> although one of them is a little better at it because of an implementation >> detail. If this characterization is true (i don't believe it is) then we >> should re-purpose or remove nextTick() and improve the performance of >> setTimeout(fn,0). I'm not suggesting that is what we do, but it's the >> logical conclusion to this characterization. >> >> >> This characterization comes from people's real impressions of nextTick. If >> you want to change that impression, you have some work to do. >>> >>> As for whether it's valid to use nextTick or setTimeout or whatever to >>> break up computation, that's not your call. >> >> Are you saying that core can't state the intention of an API? That's insane. >> >> Core is free to change the implementation details and semantics of an API at >> any time, and has on many occasions. This is always done with the intention >> of making it *better*. In order to characterize what is "better" the API >> must have a purpose and that has always been dictated by core (Ryan and then >> Isaac). >> >> As for the purpose of nextTick, I did agree on what the intended purpose >> was. And yes you can change whatever you want. You guys are in charge. And >> we're free to tell you it was a bad idea. You're free to get mad about that. >> And we're free to tell you you're being kind of bratty about it. Everybody's >> free! The only problem here is that you think you're allowed to think you're >> right more than we're allowed to think you're wrong. Strange isn't it? >> >> Let me be clear. I think the problem with missing data events should be >> fixed. But we should evaluate the solutions to make sure they aren't going >> to cause follow on problems that will haunt us. That's what I'm doing here. >> If you don't agree about follow on problems, say that. If you don't want to >> discuss potential follow on problems, say that. If you want to be upset that >> not everybody who uses node has the exact same view of it's affordances as >> you do... well I don't know how to help you with that. >> >> Instead, we got a lot of comments about names and about theoretical breakage >> in code without anyone noting running code that actually breaks or is even >> valid. And now we're being taken down the rabbit hole of "I can't use this >> for something it wasn't designed for". >> >> >> So since a hand full of people who saw this message and decided to respond >> don't have concrete use cases in hand ready to go, you can dismiss all >> concerns? That's crap. We *should* find some use cases, but that doesn't >> mean the discussion here isn't useful or that we can't reason about what >> might happen. Reasoning about semantics is how programming works. Or at >> least that's usually how I do it. >> >> The way in which people are providing feedback to this proposed changed is >> unproductive because they do not recognize the reality of the current >> semantics. >> 1) that we cannot remove nextTick() and it is heavily relied on. >> 2) that much of the code that *currently* relies on nextTick() breaks under >> heavy load because of the current implementation. >> >> All of this feedback is "me too". It's statements of opinion without >> reference the problem that must be solved. >> >> There's some truth to this. As I said, the problem to be solved is >> important. But pretending it's the only thing that's important and that >> there isn't potential to cause other problems is ludicrous. Also ludicrous >> is bullying and yelling at people who came here to discuss things with you >> in good faith precisely because we care deeply about node and the direction >> it goes in. Try to get some perspective here man. Also try meditation. >> >> >> The intention of feedback should be to change the minds of those that >> proposed the change, not to prove that your'e right under your terms. >> >> I don't think that's what anyone here has done. I even started out by saying >> I may need to be educated about this. But I also think you and other core >> guys are sometimes obtuse and dismissive about how non-core people actually >> build their mental model about node execution and how that affects the >> solutions they come up with. I'm not giving you *my* terms. I'm giving you >> the terms I've gotten from talking to a lot of people who are not node >> experts. And as much as node benefits from not having the baggage of >> traditional notions of i/o, it does have the baggage of people's long >> experience with javascript execution. You can ignore that useful data at >> your peril. >> >> :Marco >> >> -- >> Marco Rogers >> >> Life is ten percent what happens to you and ninety percent how you respond >> to it. >> - Lou Holtz >> >> >> >> -- >> Better a little with righteousness >> than much gain with injustice. >> Proverbs 16:8 >> >> On Wednesday, 30 May 2012 04:21:58 UTC+1, CrabDude wrote: >> There seem to be 2 considerations: >> >> 1. Adding sameTick() functionality to node. >> 2. Whether nextTick() should house that behavior, or another API / name. >> >> FWIW, I always misunderstood process.nextTick() to occur, as the name >> implies, at the beginning of the next tick. In other words, the name implied >> to me that it would yield to any queued timer / IO events, and then execute >> at the beginning of the next event loop. In fact, b/c of this >> misunderstanding, I found nextTick() and setImmediate() to be eventually >> redundant. >> >> I feel fairly confident in saying that it would be easier for core to >> implement the desired behavior under a different name (sameTick(), etc...) >> and replace all calls to nextTick() with sameTick(), thisTick(), etc..., >> than to change the misperceptions others may have regarding what the >> function name implies, that it in fact actually does not execute until the >> _next_ tick. Changing the behavior of nextTick to something that conflicts >> with its name, would seem to inevitably cause misunderstandings. Core >> obviously (from this thread) though has a different perception of the >> purpose of nextTick, since it seems it has a very specific purpose for which >> it was created and is used. Ironically, those most familiar with its >> *intended purpose* are also those that are most aware that its >> implementation is not always consistent with that purpose. >> >> Is there any reasoning core has regarding why replacing all nextTick() calls >> with thisTick() would be problematic? It is after all new functionality, and >> once again the name nextTick() seems inconsistent with its proposed new >> implementation. >> >> Wouldn't nextTick inevitably be deprecated / replaced by setImmediate >> anyways? It's too bad too, nexTick() is a great name, much nicer than >> "sameTick," "thisTick," etc... >> >> Cheers, >> Adam Crabtree >> >> On Tue, May 29, 2012 at 4:28 PM, Marco Rogers wrote: >> >> The problem with this characterization of the API's history is that it's >> actually not distinguishable from setTimeout(fn, 0) except in >> implementation. As described, they are for quite literally the same thing >> although one of them is a little better at it because of an implementation >> detail. If this characterization is true (i don't believe it is) then we >> should re-purpose or remove nextTick() and improve the performance of >> setTimeout(fn,0). I'm not suggesting that is what we do, but it's the >> logical conclusion to this characterization. >> >> >> This characterization comes from people's real impressions of nextTick. If >> you want to change that impression, you have some work to do. >>> >>> As for whether it's valid to use nextTick or setTimeout or whatever to >>> break up computation, that's not your call. >> >> Are you saying that core can't state the intention of an API? That's insane. >> >> Core is free to change the implementation details and semantics of an API at >> any time, and has on many occasions. This is always done with the intention >> of making it *better*. In order to characterize what is "better" the API >> must have a purpose and that has always been dictated by core (Ryan and then >> Isaac). >> >> As for the purpose of nextTick, I did agree on what the intended purpose >> was. And yes you can change whatever you want. You guys are in charge. And >> we're free to tell you it was a bad idea. You're free to get mad about that. >> And we're free to tell you you're being kind of bratty about it. Everybody's >> free! The only problem here is that you think you're allowed to think you're >> right more than we're allowed to think you're wrong. Strange isn't it? >> >> Let me be clear. I think the problem with missing data events should be >> fixed. But we should evaluate the solutions to make sure they aren't going >> to cause follow on problems that will haunt us. That's what I'm doing here. >> If you don't agree about follow on problems, say that. If you don't want to >> discuss potential follow on problems, say that. If you want to be upset that >> not everybody who uses node has the exact same view of it's affordances as >> you do... well I don't know how to help you with that. >> >> Instead, we got a lot of comments about names and about theoretical breakage >> in code without anyone noting running code that actually breaks or is even >> valid. And now we're being taken down the rabbit hole of "I can't use this >> for something it wasn't designed for". >> >> >> So since a hand full of people who saw this message and decided to respond >> don't have concrete use cases in hand ready to go, you can dismiss all >> concerns? That's crap. We *should* find some use cases, but that doesn't >> mean the discussion here isn't useful or that we can't reason about what >> might happen. Reasoning about semantics is how programming works. Or at >> least that's usually how I do it. >> >> The way in which people are providing feedback to this proposed changed is >> unproductive because they do not recognize the reality of the current >> semantics. >> 1) that we cannot remove nextTick() and it is heavily relied on. >> 2) that much of the code that *currently* relies on nextTick() breaks under >> heavy load because of the current implementation. >> >> All of this feedback is "me too". It's statements of opinion without >> reference the problem that must be solved. >> >> There's some truth to this. As I said, the problem to be solved is >> important. But pretending it's the only thing that's important and that >> there isn't potential to cause other problems is ludicrous. Also ludicrous >> is bullying and yelling at people who came here to discuss things with you >> in good faith precisely because we care deeply about node and the direction >> it goes in. Try to get some perspective here man. Also try meditation. >> >> >> The intention of feedback should be to change the minds of those that >> proposed the change, not to prove that your'e right under your terms. >> >> I don't think that's what anyone here has done. I even started out by saying >> I may need to be educated about this. But I also think you and other core >> guys are sometimes obtuse and dismissive about how non-core people actually >> build their mental model about node execution and how that affects the >> solutions they come up with. I'm not giving you *my* terms. I'm giving you >> the terms I've gotten from talking to a lot of people who are not node >> experts. And as much as node benefits from not having the baggage of >> traditional notions of i/o, it does have the baggage of people's long >> experience with javascript execution. You can ignore that useful data at >> your peril. >> >> :Marco >> >> -- >> Marco Rogers >> >> Life is ten percent what happens to you and ninety percent how you respond >> to it. >> - Lou Holtz >> >> >> >> -- >> Better a little with righteousness >> than much gain with injustice. >> Proverbs 16:8 >> >