我有一个函数流,其中一个函数(first
函数)是异步的并返回一个promise。此函数调用其他异步函数(nestedAssyncFunction_*
)。当第一个函数和所有嵌套函数返回时,必须调用第二个函数。所以我需要在几个地方解析延迟对象(在三个嵌套函数的示例中)。
var deferred = Q.defer();
first().then(second);
function first() {
nestedAssyncFunction_1();
nestedAssyncFunction_2();
nestedAssyncFunction_3();
return deferred.promise;
}
function second() {
// some actions
}
所以我的主要问题是:如何通过几个步骤解决延期?
我在那一刻发现的是我可以从几个地方调用notify
方法,并在其处理程序内部解析主延迟对象。像这样:
var deferred = Q.defer();
deferred.progressCounter = 0;
first().then(second, undefined, notifyHandler);
function notifyHandler() {
deferred.progressCounter++;
if (deferred.progressCounter === 3) {
deferred.resolve();
}
}
function nestedAssyncFunction_1() {
// some actions
deferred.notify();
}
但接下来我的问题是:将自定义属性添加到延迟对象的最佳方法是什么?? 因为它似乎是皱眉头,就像在上面的例子中一样。
我的感激。
答案 0 :(得分:3)
这根本不是你想要的。
你想要什么:
Q.all([
nestedAssyncFunction_1(),
nestedAssyncFunction_2(),
nestedAssyncFunction_3()
]).then(function(){
//All done
});
答案 1 :(得分:1)
你可以这样做:
function first() {
//All you nested functions have to return a promise
var promises = [];
promises.push(nestedAssyncFunction_1());
promises.push(nestedAssyncFunction_2());
promises.push(nestedAssyncFunction_3());
var deferred = Q.defer();
Q.all(promises).then(function(){
//do some tasks after all promises are resolve.
deferred.resolve(); //resolve deferred objects when all promises are resolved.
});
return deferred.promise;
}
function second() {
// some actions
}
或者这个解决方案(取决于您的需求,您可以选择这个或第一个解决方案):
function first() {
//All you nested functions have to return a promise
var promises = [];
promises.push(nestedAssyncFunction_1());
promises.push(nestedAssyncFunction_2());
promises.push(nestedAssyncFunction_3());
var deferred = Q.defer();
promises.push(deferred.promise);//push the promise of current function
//do something asynch with the current function and call deferred.resolve()
return Q.all(promises);//Combine all promises into one
}
function second() {
// some actions
}
链接这样的函数:
first().then(second);