JavaScript异步/等待Array.map()中的Promises

时间:2016-08-01 09:11:06

标签: javascript async-await babeljs es6-promise ecmascript-next

给出以下代码

class SomeClass {
  async someFunc() {
    const urlParameters = [0, 1, 2];
    const batchAjaxResult = await urlParameters.map((parameter) => { 
        const result = await $.get(`someUrl/${parameter}`);
        return {
          parameter,
          result
        }
     });

  console.log(batchAjaxResult);

  }
}

JavaScript将返回一个已解析的Promises数组,而不是实际的Promises结果。

这可能是由于Array.map()未被实施为承诺。

是否存在基于承诺的Array.map版本?

这个问题与How to return the response from an asynchronous call不同,因为它是关于如何返回Array.map内包含的批量响应。

2 个答案:

答案 0 :(得分:3)

你可以使用这个简单的函数链接promises来实现顺序执行:

function asyncMap(arr, mapper) {
  var q = Promise.resolve();
  return Promise.all(arr.map(v => q = q.then(() => mapper(v))));
}


// Usage

asyncMap([1, 2, 3], v => {
  return new Promise(resolve => {
    console.log("Start " + v);
    setTimeout(() => {
      console.log("End " + v);
      resolve("foo" + v);
    }, 500);
  });
}).then(a => console.log(a));

答案 1 :(得分:2)

通过写这个问题,我设法找到了问题的根源。

看起来Bluebird有一个名为Promise.map

的功能

类似地,有一个名为Promise.all的本机实现创建了一个"批量承诺"

我按如下方式更改了代码并且它正在工作:

key1, sum(c1)
key1, key2, sum(c1)
key1, key2, key3, sum(c1)