用q.js链接承诺
chaining promises with 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
。
我真的只是想拥有一些返回promise的方法,然后以瀑布式的方式将它们链接在一起——我想我可以使用async和瀑布,但我只是想知道这是否可以通过promise实现。
这是因为then
不期望另一个promise作为参数。相反,它需要处理程序函数、回调和/或错误返回,您在第二个示例中传递的是前者。事实上,任何而不是函数的参数都会被忽略。
来自文档:
如果在处理程序中返回一个值,outputPromise就会实现。
如果在处理程序中抛出异常,outputPromise将被拒绝。
如果在处理程序中返回promise,outputPromise将"成为"该promise。能够成为一个新的承诺对于管理延迟、组合结果或从错误中恢复非常有用。
所以,是的,连锁承诺是可以实现的。你在第二个例子中做得对。
这里传递已实现承诺的人为例子可能会使链接承诺的工作方式看起来过于冗长,但在现实世界中,你通常会链接承诺,因为你对它们的返回值感兴趣,例如:
somethingAsync().then(function (n) {
return somethingElseAsync(n);
})
.then(function (n) {
return somethingElseAsync(n);
})
.then(function (result) {
// ...
})
(实际上这个镜像了async.waterfall
。如果你只想按顺序调用一系列异步函数,而不考虑它们的结果,你可以使用async.series
)
我知道javascript没有静态类型,但您需要考虑这里的类型。
Q(1); // has type Promise[Int]
function (n) { return Q(2); } // has type Int => Promise[Int]
Q.then
需要第二个。
相关文章:
- Q 承诺链接以正确的顺序做事
- 带有传递参数的角度承诺链接
- 如何进行条件承诺链接
- 承诺链接:在next-then回调中使用上一个承诺的结果
- 如何在Javascript中使用Azure移动服务自定义API的承诺/链接
- 承诺-链接解决/拒绝
- Javascript承诺链接
- 如何将同步函数与承诺链接起来以异步运行
- 简化使用$q.defer()进行承诺链接的Angular函数
- Node.js承诺链接
- 将大量(>40,000)原生承诺链接在一起会消耗太多内存
- JavaScript承诺:链接承诺混淆
- 适当的承诺链接
- 如何使用jQuery承诺链接三个异步调用
- 如何将这些函数与承诺链接在一起
- 系统.导入承诺链接
- JavaScript/jQuery承诺链接
- 如何在NodeJS中使用承诺链接Postgres查询和GET请求
- 如何将承诺链接起来'然后'& # 39;所有# 39;
- 将多个 ajax 请求与承诺链接起来