function getFullName( id ){
return ajax( "/user/" + id + "/name" ) + " " + ajax( "/user/" + id + "/lastname" )
}
I've read through the source and it mentions blocking etc. but I didn't see quite what I was looking for.So here's the deal: at one point I was working on laziness library to treat promises as lazy values, and the problem that I ran into was that JS doesn't let you overload the operators `+`, `-`, etc. so that the API needs to export things like `Lazy.plus(p1, p2, p3)`. By itself that's not so bad -- it even makes everything look lispy in a strangely C syntax -- but it was sufficiently heavy that I kind of abandoned the project.
So from my understanding, the `+` can only work if the `ajax()` calls now block the global browser JS thread. Is that true? Does the above function even work synchronously, if I call it?
Of course, to actually use this function we have to use `Syncify.revert` which converts it back into a callback-based function. Does Syncify.revert have to somehow parse the function? How does it "stick its own context" into the function that it's calling without something complicated like dynamic variable scope? Or did you find a way to hack dynamic scope into JS?
Here's an example: https://jsfiddle.net/k61y5sLo/2/
Pre-callback
Evaluating getCallbackText()
Post-callback
callbackTest => cb("Alice")
Evaluating getCallbackText()
callbackTest => cb("Bob")
Evaluating getCallbackText()
Callback returned: Alice Bob
https://github.com/aldonline/reactivitySo it looks like Syncify.js evaluates the parent getCallbackText() function each time that one of its child callbackTest("Alice") or callbackTest("Bob") functions fire. Conceptually it replaces instantiations of callbackTest() with their return values. So on the final pass there are no more child functions to evaluate and it can return the final value.
If this all sounds correct (and please correct me if I'm wrong) then the tradeoff is some re-run overhead in order to skip having to deal with promises or yield/generators.
I suspect that they're doing something else, and given the Syncify.parallel construct, I don't think they're blocking the whole thread.
or
https://github.com/petkaantonov/bluebird/blob/master/API.md#...
Wouldn't you just send a request to the server and have it handle things and spit out the correct response/return value? What's the need for multiple ajax calls?! I know we're obviously not using this to fetch first and last names - what's a realistic example for this usage pattern?
[0]: http://jsonapi.org/
Instead, you can yield promises inside generator functions, or better yet use async/await with a transpiler. Both methods give you nice sync-looking code.
I guess what you're trying to say is that once you adopt Promises a large portion of your code will have to be tailored to use it.
To which I respond: .. yes, so what? It's better than callbacks. And it's better than some "magic fairydust" that doesn't make it explicit that you're doing something async.
Edit: And the "problem" with async/await and CoffeeScript is that the former is currently available in various JS transpilers but you can't use one of those and CoffeeScript at the same time.
This isn't a necessity, since you can create a function which both returns a Promise and accepts a callback. Most Promise libraries make this easy to support, which makes it easy to introduce Promises into projects that already use callbacks, and vice-versa.
Sometimes the website answers that. This one doesn't, and so I'm absolutely not going to use it, because I don't understand it.
Nothing of your sync functions work until after you do syncify.revert which gives you a function taking a CALLBACK.
function getFullName( id ){ return ajax( "/user/" + id + "/name" ) + " " + ajax( "/user/" + id + "/lastname" ) }
How does it know to to wait for both ajax functions before returning the correct value? Am I misunderstanding something?