javascript - Q.all() 和 Promise.prototype.all() 方法有什么区别?

标签 javascript promise q

我试图了解 Promise 是如何工作的,所以总体思路非常清晰,但目前我坚持使用 all() 方法。我知道,它曾经对一系列其他 promise 做出 promise ,当数组中的所有 promise 都得到解决时,这些 promise 将被解决,或者当数组中的任何 promise 被拒绝时,这些 promise 将被拒绝。这是我的代码片段:

var qu = require('q');
var proArr = [];

for(var i = 0; i < 4; i++) {
    var tmpDef = qu.defer();

    (function(index, tmpDef) {
        setTimeout(function() {
            console.log('Timeout ' + index + ' has triggered!');
            tmpDef.resolve();
        }, (i + 1) * 1000);
        proArr.push(tmpDef.promise);
    })(i, tmpDef);
}

qu.all(proArr).then(function() { 
    console.log('All timeouts has passed with Q.all()!');
    return 'some result';
});
qu.defer().promise.all(proArr).then(function() { 
    console.log('All timeouts has passed with promise.all()!');
    return 'some result';
});

对于此代码片段,当触发所有超时时,由 qu.all() 方法返回的 promise 将得到解决,但由 qu.defer() 返回的 promise 将得到解决即使所有超时都被触发,.promise.all() 方法也将保持挂起状态。那么 Promise.prototype.all() 方法有什么用途呢?它与 Q.all() 方法有何不同?

我还查看了 Q 库源代码,这里是 Promise.prototype.all() 方法的代码:

Promise.prototype.all = function () {
    return all(this);
};

据我所知,这个方法调用 Q.all() 并使用当前 Promise 的实例作为参数,但为什么呢? Q.all() 方法不需要接受 Promise 数组吗?因此,我将非常感谢您对所有这些时刻的澄清。

最佳答案

Don't the method Q.all() have to accept an array of promises?

不,事实上,Q.all 方法也可以接受一个 Promise 数组的 Promise。你可以看到in the code好吧,它确实调用 Q.when在输入上。这可能看起来有点没用,但它是一个更宽容的 API,并且显然简化了 Promise.prototype.all 的实现。

What is the difference between Q.all() and Promise.prototype.all()?

让我们回到更简单的思维模型。 Q.all 是一个静态函数,它接受一个 Promise 数组并返回一个包含所有结果的数组的 Promise。

.all 原型(prototype)方法非常方便。而不是写

….then(Q.all).…

你可以使用

….all().…

在 promise 链中 - 这些是完全等价的。请注意,.all 原型(prototype)方法不接受任何参数 - 它确实从调用它的 Promise 获取数组。

a promise, which returned by Q.defer().promise.all(proArr) method will stay in pending state even if all timeouts will be triggered

是的。这有两个原因:

  • Q.defer().promise 是一个永远不会解决的 promise (并且由于您已经丢弃了延迟,所以您永远无法解决)。该链甚至没有前进到 .all(...) 调用。
  • 如上所述,您在此处调用的原型(prototype)方法不带任何参数。 proArr 被简单地忽略。

如果你想使用它,你可以使用以下内容:

Q(proArr).all().…

关于javascript - Q.all() 和 Promise.prototype.all() 方法有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31872609/

相关文章:

javascript - 在 Bluebird 中处理多个嵌套异步操作(promises)

javascript - Node q promise 递归

javascript - 使用 q Promise 和 Map 来获取文件内容

javascript - jQuery ajaxSetup 方法是否不适用于 $.get 或 $.post?

javascript - $(.class).eq().append 在工作两次后附加到错误的类

javascript - 简单的 Dojo 国际化实现

区间搜索树的Javascript实现

javascript - 用 Promise 编写服务层

javascript - 为什么 .then() 在没有 JavaScript promise 的情况下工作?

用于在 promise 链上来回移动的 Javascript 模式