javascript – 链接承诺与q.js

我正在努力了解承诺链接的工作原理.我正在使用q.js.这是我正在玩的.

var Q = require("q"); // npm install q

// the function Q(value) returns a fulfilled promise with the value... I think.
Q(1).then(Q(2)).then(Q(3)).then(Q(4)).then(function(n) {
    console.log(n);
});

Q(1).then(function(n) {
    return Q(2);
}).then(function(n) {
    return Q(3);
}).then(function(n) {
    return Q(4);
}).then(function(n) {
    console.log("done: " + n);
});

我的问题基本上归结为为什么第一个日志1,而后者记录我会期望的,基本上记录1到4.我曾经希望第一个记录4而不是1.

我真的只想有一些可以回报承诺的方法,然后将它们连在一起,像时尚瀑布一样 – 我想我可以使用async和瀑布,但只想知道是否可以实现这个承诺.

最佳答案
这是因为那时候不会有另一个承诺作为论证.相反,它期望处理函数,回调和/或错误回溯,您在第二个示例中传递的前一个. Indeed any argument that is not a function is simply ignored.

From the docs

If you return a value in a handler, outputPromise will get fulfilled.

If you throw an exception in a handler, outputPromise will get rejected.

If you return a promise in a handler, outputPromise will “become” that promise. Being able to become a new promise is useful for managing delays, combining results, or recovering from errors.

所以是的,链接的承诺可以做到.你在第二个例子中做的正确.

可能的是,通过履行承诺的设计例子使得链接承诺的作用似乎过于冗长,但在现实世界的使用中,您通常链接承诺,因为您对其返回值感兴趣,例如:

somethingAsync().then(function (n) {
  return somethingElseAsync(n);
})
.then(function (n) {
  return somethingElseAsync(n);
})
.then(function (result) {
  // ...
})

(实际上,这反映了async.waterfall.如果你只是想调用一系列异步函数,而不考虑他们的结果,你可以使用async.series)

转载注明原文:javascript – 链接承诺与q.js - 代码日志