【问题标题】:jQuery promise with dependent promise and overall completion具有依赖承诺和整体完成的 jQuery 承诺
【发布时间】:2015-03-17 00:24:52
【问题描述】:

假设我有 2 个承诺 promise1, promise2 会异步执行某些操作。

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

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

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

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

当前 runPromises 会在 promise1 未完成时发出警报。

【问题讨论】:

  • 如果promise2只有在promise1完成后才能启动,那你就不能等2完成吗?
  • 需要返回 promise2() 吗?
  • 我尝试返回 promise2() 并得到了TypeError: Cannot read property 'done' of undefined。我相信在这种情况下 runPromises 在 promise1 完成之前不会是一个承诺,因此会导致它未定义。

标签: jquery promise


【解决方案1】:

这是一个使用两个简单函数 process1 和 process2 的示例。这些函数关闭并异步执行某些操作(在这种情况下,我只是使用 setTimeout 来模拟它)并返回承诺(为此使用 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
        });

【讨论】:

  • 看起来不错,但我宁愿不引入新库。我还没有看过Q,但现在会看。我有兴趣看到它给我的东西比我在 jquery 中得到的东西。
  • 您介意在您的示例中使用 jQuery 承诺吗?
【解决方案2】:

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

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

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

【讨论】:

  • 这也有效,似乎我错过了 .done() 和 .then() 之间的细微差别。非常感谢您向我展示了我的方式的错误:)
  • @4imble - 在我看来,真的没有理由使用.done()。它不是标准的一部分,.then() 涵盖相同的目的。
【解决方案3】:

使用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!')});

【讨论】:

  • 这在这种情况下可以工作,但我想在其他地方实现完成条件。在我的例子中,我调用 runPromises()
【解决方案4】:

典型的,我在发布问题之前尝试了 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");
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多