This is Q version 1, from the v1
branch in Git. This documentation applies to the latest of both the version 1 and version 0.9 release trains. These releases are stable. There will be no further releases of 0.9 after 0.9.7 which is nearly equivalent to version 1.0.0. All further releases of q@~1.0
will be backward compatible. The version 2 release train introduces significant and backward-incompatible changes and is experimental at this time.
If a function cannot return a value or throw an exception without blocking, it can return a promise instead. A promise is an object that represents the return value or the thrown exception that the function may eventually provide. A promise can also be used as a proxy for a remote object to overcome latency.
On the first pass, promises can mitigate the “Pyramid of Doom”: the situation where code marches to the right faster than it marches forward.
step1(function (value1) {
step2(value1, function(value2) {
step3(value2, function(value3) {
step4(value3, function(value4) {
// Do something with value4
});
});
});
});
使用诺言库, 你可以使金字塔扁平.
Q.fcall(promisedStep1)
.then(promisedStep2)
.then(promisedStep3)
.then(promisedStep4)
.then(function (value4) {
// Do something with value4
})
.catch(function (error) {
// Handle any error from all above steps
})
.done();
With this approach, you also get implicit error propagation, just like try
,catch
, and finally
. An error in promisedStep1
will flow all the way to the catch
function, where it’s caught and handled. (Here promisedStepN
is a version of stepN
that returns a promise.)
The callback approach is called an “inversion of control”.A function that accepts a callback instead of a return value is saying, “Don’t call me, I’ll call you.”. Promises un-invert the inversion, cleanly separating the input arguments from control flow arguments. This simplifies the use and creation of API’s, particularly variadic, rest and spread arguments.