Promise.all 不应该像传递给 .then 的函数一样工作吗?
Shouldn't Promise.all work as the function passed to .then?
此代码适用于 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);
});
然而,第二个 .then 包含一个 'useless' 匿名函数(调用具有相同参数的单个函数,返回结果)。
据我所知,这种模式可以而且应该通过直接引用函数本身来替换,如下所示:
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 上失败,分别是:
FAILED: TypeError: undefined is not a function
和
FAILED: TypeError: _runMicrotasks is not a function
我认为这是一个错误是否正确?或者我的理解是匿名函数可以替换为对要调用的函数的简单引用不正确?
这在很大程度上取决于函数的定义方式。如果该函数使用对象的上下文,那么您需要提供适合该特定上下文的上下文(即 Promise 对象)。
如果该函数使用 this
,那么您需要执行以下操作:
Promise.all.bind(Promise);
但是如果函数直接使用Promise
对象就没有关系了。不过,为了与其他 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);
});
然而,第二个 .then 包含一个 'useless' 匿名函数(调用具有相同参数的单个函数,返回结果)。
据我所知,这种模式可以而且应该通过直接引用函数本身来替换,如下所示:
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 上失败,分别是:
FAILED: TypeError: undefined is not a function
和
FAILED: TypeError: _runMicrotasks is not a function
我认为这是一个错误是否正确?或者我的理解是匿名函数可以替换为对要调用的函数的简单引用不正确?
这在很大程度上取决于函数的定义方式。如果该函数使用对象的上下文,那么您需要提供适合该特定上下文的上下文(即 Promise 对象)。
如果该函数使用 this
,那么您需要执行以下操作:
Promise.all.bind(Promise);
但是如果函数直接使用Promise
对象就没有关系了。不过,为了与其他 Promise
实现兼容,我仍然会绑定它。