[英]Cannot figure out how to chain nested promise with Q
我是node.js的新手並承諾(Q),所以請保持友好。 我想將嵌套的諾言與他執行的父鏈鏈接起來,但我找不到方法。
我制作了一個玩具腳本來說明我的pb,您可以使用node.js啟動它:
var Q = require("q");
function init() {
return {nbIn: 0, nbOut: 0, stop: false};
}
function fn1(ctx) {
var deferred = Q.defer();
console.log("fn1:" + JSON.stringify(ctx));
setTimeout(function() {
console.log("fn1: resolve");
deferred.resolve(ctx);
}, 1000)
return deferred.promise;
}
function sub1(ctx) {
var deferred = Q.defer();
console.log("sub1:" + JSON.stringify(ctx));
setTimeout(function() {
++ctx.nbIn;
console.log("sub1: resolve");
deferred.resolve(ctx);
}, 1000);
return deferred.promise;
}
function sub2(ctx) {
var deferred = Q.defer();
console.log("sub2:" + JSON.stringify(ctx));
setTimeout(function() {
++ctx.nbOut;
if(ctx.nbOut === 3) {
console.log("sub2: resolve");
ctx.stop = true;
deferred.resolve(ctx);
}
else {
console.log("sub2: promise");
return sub1(ctx).then(sub2);
}
}, 1000);
return deferred.promise;
}
function fn2(ctx) {
console.log("fn2:" + JSON.stringify(ctx));
return sub1(ctx).then(sub2);
}
function fn3(ctx) {
console.log("fn3:" + JSON.stringify(ctx));
}
Q.fcall(init).then(fn1).then(fn2).then(fn3);
它顯示:
fn1:{"nbIn":0,"nbOut":0,"stop":false}
fn1: resolve
fn2:{"nbIn":0,"nbOut":0,"stop":false}
sub1:{"nbIn":0,"nbOut":0,"stop":false}
sub1: resolve
sub2:{"nbIn":1,"nbOut":0,"stop":false}
sub2: promise
sub1:{"nbIn":1,"nbOut":1,"stop":false}
sub1: resolve
sub2:{"nbIn":2,"nbOut":1,"stop":false}
sub2: promise
sub1:{"nbIn":2,"nbOut":2,"stop":false}
sub1: resolve
sub2:{"nbIn":3,"nbOut":2,"stop":false}
sub2: resolve
我想將最后一行sub2
與fn3
。
任何幫助表示贊賞,謝謝。
setTimeout(function() { … return sub1(ctx).then(sub2); }, …)
在這里,您嘗試從異步普通回調return
。 您不能這樣做,結果將丟失,因為setTimeout
不關心它。
您只能從.then()
回調return
。 在您的情況下,它看起來像這樣:
function sub2(ctx) {
var deferred = Q.defer();
console.log("sub2:" + JSON.stringify(ctx));
setTimeout(function() {
deferred.resolve(ctx);
}, 1000);
return deferred.promise.then(function(ctx) {
++ctx.nbOut;
if (ctx.nbOut === 3) {
console.log("sub2: resolve");
ctx.stop = true;
return ctx;
} else {
console.log("sub2: promise");
return sub1(ctx).then(sub2);
}
});
}
您還可以看到您現在一直在使用Q.defer
和setTimeout
。 您應該為返回promise的函數創建一個輔助函數,並盡可能少使用deferreds 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.