使用蓝鸟承诺迭代数组

时间:2016-11-30 05:06:03

标签: javascript promise

我试图通过将数组中的所有值乘以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/

提前致谢!

3 个答案:

答案 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;
    }));
   }