Как использовать Array.prototype.map () с then () для connection.end () - PullRequest
2 голосов
/ 10 октября 2019

У меня ошибка TypeError: cars.map(...).then is not a function. Я хочу разорвать соединение при обновлении цвета.

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

Ответы [ 2 ]

3 голосов
/ 10 октября 2019

Этот ответ применяется только в том случае, если updateColor является асинхронным и действительно возвращает объект Promise.

.map возвращает массив чего-либо, а не Promise. Что вы можете сделать, это построить массив Promise, используя .map, а затем разрешить их все, используя Promise.all, а затем обработать результат.

Следующий код выполнит все updateColor, подождитепока они не будут завершены, а затем прекратите соединение.

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

    return false;
  }))
  .then(() => connection.end())

Использование async/await вместо Promises

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

        return false;
      }));

   connection.end();

с использованием reduce вместо map

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

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

connection.end();
2 голосов
/ 10 октября 2019

Есть несколько проблем:

  1. Нет смысла использовать map, когда вы не используете создаваемый массив. Чтобы перебрать массив, используйте forEach или любой из нескольких других механизмов .

  2. map - это полностью синхронная функция. Чтобы сделать что-то после этого, просто ... сделайте что-то после этого.

  3. then - это метод обещаний (ну, thenable ). map возвращает массив, а не обещание.

Итак:

for (const item of cars) {
    if (item.color === 'red') {
        updateColor(item.id)
    }
};
connection.end();

Если updateColorвыполняет свою работу асинхронно и возвращает обещание, затем см. ответ Грегори NEUT .

...