【发布时间】:2016-01-26 03:06:41
【问题描述】:
给定
let arr = [1,2,3];
function filter(num) {
return new Promise((res, rej) => {
setTimeout(() => {
if( num === 3 ) {
res(num);
} else {
rej();
}
}, 1);
});
}
function filterNums() {
return Promise.all(arr.filter(filter));
}
filterNums().then(results => {
let l = results.length;
// length should be 1, but is 3
});
长度为 3,因为返回的是 Promise,而不是值。有没有办法使用返回 Promise 的函数过滤数组?
注意:本例中 fs.stat 已替换为 setTimeout,具体代码见https://github.com/silenceisgolden/learn-esnext/blob/array-filter-async-function/tutorials/array-filter-with-async-function.js。
【问题讨论】:
-
“有没有办法使用返回 Promise 的函数来过滤数组?” 使用
Array#filter肯定不行。 -
@FelixKling 这也是我的结论,但你能进一步解释背后的原因吗?我不明白为什么会这样。这对我来说似乎是半合乎逻辑的。
-
因为过滤器需要一个返回布尔值而不是承诺对象的函数
-
@JonahWilliams 是的,我明白这一点。将过滤器函数更改为异步函数会产生相同的结果,所以我猜这也会返回一个承诺,而不是等待返回的布尔值。
标签: javascript arrays ecmascript-6 es6-promise