如何使用 Array.prototype.map() 和 then() 进行 connection.end()

2 javascript node.js promise es6-promise

我有一个错误TypeError: cars.map(...).then is not a function。我想在更新颜色时终止连接。

cars.map(function (item, i) {
    if (item.color === 'red') {
        updateColor(item.id)
    }
}).then(() => connection.end())
Run Code Online (Sandbox Code Playgroud)

Gré*_*EUT 7

此答案仅适用于updateColor异步且确实返回Promise对象的情况。

.map返回一个数组,而不是一个Promise. 您可以做的是构建一个Promiseusing数组,.map然后使用所有解析它们Promise.all,然后处理结果。

下面的代码将执行 all updateColor,等待它们完成然后停止连接。

Promise.all(cars.map((item, i) => {
    if (item.color === 'red') {
      return updateColor(item.id);
    }

    return false;
  }))
  .then(() => connection.end())
Run Code Online (Sandbox Code Playgroud)

使用async/await代替Promises

  await Promise.all(cars.map((item) => {
        if (item.color === 'red') {
          return updateColor(item.id);
        }

        return false;
      }));

   connection.end();
Run Code Online (Sandbox Code Playgroud)

使用reduce代替map

await Promise.all(cars.reduce((tmp, x) => (x.color === 'red' ? [
  ...tmp,

  updateColor(x.id),
] : tmp), []));

connection.end();
Run Code Online (Sandbox Code Playgroud)