//pseudo code
function f2(){
var deferred = Q.defer();
Q.all(chunked.map(f12)).then(function(results){
Q.all(results.map(f13)).then(function(){
//f13 returns promise that return value
deferred.resolve();
});
});
return deferred.promise;
}
f2().then(function(){
console.log("end");
});
所以我已经修改了功能,我知道“反模式”但我有特定的功能需要被修改。我有两个嵌套的q.all函数。一切都运行良好,但f2()。然后(...不等待deferred.resolve()并立即在控制台中抛出“结束”,然后执行所有“排队”的承诺。所以我可以做什么来等待解决?
答案 0 :(得分:0)
正如其他人所说,(在阅读了一些关于Q.defer()
的内容后),我发现您正在多次解析deferred
变量。
如果我理解你要做的正确,你应该在(实际上“开启”)外部Q.all()
承诺解决方案后解决。
//pseudo code
function f2(){
var deferred = Q.defer();
Q.all(chunked.map(f12)).then(function(results){
// Notice prepended 'return' to not break the chain.
return Q.all(results.map(f13)).then(function(){
//f13 returns promise that return value
//deferred.resolve(); // Wrong.
return f13;
});
}).then(function(arr){
deferred.resolve(arr); // <-- This resolves ONCE.
// Of course you don't need to return arr if you doesn't
// care about it. But I think is always better to do things right.
return arr; // Also unnecessary unless you could want to chain
// another .then() to the outer promise.
});
return deferred.promise;
}
f2().then(function(){
console.log("end");
});
希望它有所帮助(当然,未经测试:它可能包含错误,但我认为它解释了这个概念)。
编辑:我错过了说(即使你告诉过你知道它是反模式),至少在你的例子中没有理由使用{{ 1}}因为你可以直接返回外部Q.all()promise ...
也许您发布的内容只是更复杂代码的简化版本......
但是下面应该暴露出相同的行为并且更加简单:
Q.defer()