如何将一系列项目映射到promises并按顺序等待它们?

时间:2018-02-07 15:48:09

标签: javascript promise async-await

说我有一个像这样的项目列表:

const list = [0, 1, 2, 3, 4];

我有一些异步获取功能:

async function fetchSomething(x) { /* ... */ }

我想知道是否有办法将list映射到fetchSomething的结果,但*会在下一次搜索后运行每次提取。

我知道我可以使用asyncawait使用for ... of循环执行此操作,如下所示:

const list = [0, 1, 2, 3, 4];

function fetchSomething(x) {
  return new Promise(resolve => {
    setTimeout(() => {
      const value = `fetched ${x}!`;
      console.log(value);
      resolve(value);
    }, 500);
  });
}

async function main() {
  const newList = [];

  for (const item in list) {
    newList.push(await fetchSomething(item));
  }

  console.log({newList});
}

main();

但这不是很“实用”。

我也知道我可以使用Promise.all,但问题在于它会立即触发所有承诺。如果他们顺序关闭我会更喜欢:

const list = [0, 1, 2, 3, 4];

function fetchSomething(x) {
  return new Promise(resolve => {
    setTimeout(() => {
      const value = `fetched ${x}!`;
      console.log(value);
      resolve(value);
    }, 500);
  });
}

async function main() {
  const newList = await Promise.all(list.map(x => fetchSomething(x)));
  console.log({newList});
}

main();

知道如何将项目列表映射到承诺并让每个承诺按顺序完成并仍然具有“功能性”/声明式样式吗?

0 个答案:

没有答案