我试图通过将数组中的所有值乘以2然后返回更新的数组来迭代带有promise的数组:
var Bluebird = Promise.noConflict()
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
function loopThroughArray(arr) {
return Bluebird.each(arr, function(value) {
return value = value * 2;
}).then(function(arr) {
console.log('--done--');
console.log(arr);
// should return [2, 4, 6, 8, 10, 12, 14, 16, 18];
});
}
loopThroughArray(arr);
然而,我的函数仍然返回原始数组..有人可以帮忙吗?这是我的小提琴:
http://jsfiddle.net/mpo4yrmu/71/
提前致谢!
答案 0 :(得分:3)
而不是.each
使用.map
。
.each
并不关心返回值,.map
确实。
小提琴:http://jsfiddle.net/free_soul/mpo4yrmu/73/
var Bluebird = Promise.noConflict()
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
function loopThroughArray(arr) {
return Bluebird.map(arr, function(value) {
return value = value * 2;
}).then(function(arr) {
console.log('--done--');
console.log(arr);
// does return [2, 4, 6, 8, 10, 12, 14, 18, 19];
});
}
loopThroughArray(arr);
答案 1 :(得分:2)
var Bluebird = Promise.noConflict()
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
function loopThroughArray(arr) {
return Bluebird.map(arr, function(value) {
return value = value * 2;
}).then(function(arr) {
console.log('--done--');
console.log(arr);
// should return [2, 4, 6, 8, 10, 12, 14, 18, 19];
});
}
loopThroughArray(arr);
使用.map
来实现您在此处显示的目标。
为什么.each
无效?
答案:each
函数是一个迭代器。它将迭代一个数组或数组的promises,其中map
也将遍历数组,但它将等待从它返回的值,并将每次迭代的返回值存储到数组中。
然后你可以进入那个数组。
答案 2 :(得分:0)
Bluebird.each()
解析为未修改的原始数组,这就是您记录原始数组的原因。
Bluebird.each
...解析为未修改的原始数组,此方法用于副作用。如果迭代器函数返回一个promise或一个thenable,那么等待promise的结果,然后再继续下一次迭代。
http://bluebirdjs.com/docs/api/promise.each.html
正确的方法是使用 Javascript的原生Array.prototype.map()
:
//your promise code here
...function(arr) {
console.log('done!');
console.log(arr.map(function(element) {
return element * 2;
}));
}