不应该Promise.all作为函数传递给.then?

时间:2016-01-20 22:31:15

标签: javascript es6-promise

此代码适用于Chrome(47),FF(43)和Node.js(4.2.2):

Promise.resolve()
.then(function() {
    return new Array(5).fill(Promise.resolve('hello world'));
})
.then(function(promisesArr) {
    return Promise.all(promisesArr);
})
.then(function(allResults) {
    console.log(allResults);
}).catch(function(err) {
    console.log('FAILED: ' + err);
});

然而第二个。然后包含一个无用的'匿名函数(使用相同的参数调用单个函数,返回结果)。

据我了解,这种模式可以而且应该直接引用函数本身来取代,如下所示:

Promise.resolve()
.then(function() {
    return new Array(5).fill(Promise.resolve('hello world'));
})
.then(Promise.all)
.then(function(allResults) {
    console.log(allResults);
}).catch(function(err) {
    console.log('FAILED: ' + err);
});

然而,虽然这适用于FF,但它在Chrome上失败并且(可以预测,因为它也基于V8)在Node上分别用:

  

失败:TypeError:undefined不是函数

  

失败:TypeError:_runMicrotasks不是函数

我认为这是一个错误吗?或者我的理解是匿名函数可以被替换为对函数的简单引用不正确吗?

1 个答案:

答案 0 :(得分:1)

这在很大程度上取决于函数的定义方式。如果函数使用对象的上下文,那么您需要提供一个适合该特定上下文的函数(即Promise对象)。

如果该功能使用this,那么您需要执行以下操作:

Promise.all.bind(Promise);

但是如果函数直接使用Promise对象,那么它并不重要。我仍然绑定它,以便与其他Promise实现兼容。