如何多次解决Q延迟对象,即逐步解决?

时间:2013-12-30 13:47:18

标签: javascript asynchronous q

我有一个函数流,其中一个函数(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();
}

但接下来我的问题是:将自定义属性添加到延迟对象的最佳方法是什么?? 因为它似乎是皱眉头,就像在上面的例子中一样。

我的感激。

2 个答案:

答案 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);