具有依赖承诺和整体完成的jQuery承诺

时间:2015-03-16 11:31:06

标签: jquery promise

假设我有2个承诺promise1, promise2,它们会异步地做一些事情。

promise2依赖于promise1在运行之前完成。这很容易。

function runPromises(){
    return promise1().done(function(){
       promise2();
    });
}

问题是我也想知道他们什么时候都完成了。

runPromises().done(function(){
   alert("promise 1 and 2 done");
});

当promise1不同时执行时,runPromises会发出警报。

4 个答案:

答案 0 :(得分:2)

以下是使用两个名为process1和process2的简单函数的示例。这些函数关闭并异步执行某些操作(在这种情况下,我只是使用setTimeout来模拟这个)并返回promises(使用q库)。流程1运行,然后流程2运行,当流程2返回时,有空间做某事。希望这会有所帮助:

var process1 = function() {
        var deferred = q.defer();
        setTimeout(function() {
            deferred.resolve();
        }, 10);

        return deferred.promise;
    };

    var process2 = function() {
        var deferred = q.defer();
        setTimeout(function() {
            deferred.resolve();
        }, 10);

        return deferred.promise;
    };

    process1()
        .then(process2)
        .then(function() {
            // Process 1 and 2 have completed
        });

答案 1 :(得分:1)

要链接承诺操作,并获得第二个结果的承诺(即两者都完成后),请使用then方法而不是done

function runPromises(){
    return promise1().then(function(){
//                    ^^^^
        return promise2();
//      ^^^^^^ always return promise from async functions like this callback
    });
}

如果您不关心这些论点,您甚至可以将其缩短为return promise1().then(promise2);

答案 2 :(得分:0)

使用then链接承诺:

 promise1().then(promise2).then(promise3).done(function(){
        alert("promise 1 and 2 and 3 done");
    });

<强>编辑:

function runPromises(){ 
   return promise1().then(promise2).then(promise3);
}
runPromises().done(function(){console.log('all done!')});

答案 3 :(得分:-3)

典型的,我尝试了30分钟,试图在发布问题之前找到解决方案,但现在我找到了答案。

我可以通过新建$ .Deferred();

来做到这一点
function runPromises(){
    var d1 = new $.Deferred();
    promise1().done(function(){
       promise2().done(function(){
           d1.resolve();
       };
    });

    return d1.promise();
}

runPromises().done(function(){
   alert("promise 1 and 2 done");
});