как предотвратить прерывание цикла обещаний несмотря на ошибки - PullRequest
0 голосов
/ 19 декабря 2018

Я только начал использовать Promise в своем приложении узла.И я полагаю, что в приведенном ниже коде цикл прервется, если один из них вернет ошибку, которая отклонена.

Есть ли способ, позволяющий завершить цикл, пропуская те с ошибками.И я все еще хотел бы, чтобы все уведомления об ошибках в конце цикла.

Еще один вопрос: есть ли лучший способ для resolve вместо использования count++; if(count===items.length) resolve(items)

get_customer_purchase = (items) => {
  return new Promise((resolve, reject)=>{
    let count = 0;
    for (let i in items) {
      get_options(items[i].id).then((options)=>{
        //do some process
         count++; if(count===items.length) resolve (items)
      }).catch((error)=>reject(error))
    }    
  })
}

1 Ответ

0 голосов
/ 19 декабря 2018

Вы можете написать так:

get_customer_purchase = (items) => {
  const promiseArray = items.map((item) => {
    return get_options(item.id)
  })

  return Promise.all(promiseArray)
    .then((optionsResult) => items)
}

Обратите внимание, что в случае сбоя одного get_options вы получите один сбой:

get_customer_purchase(array)
  .then(items => /** do stuff */ )
  .catch(error => /** one get_options fail */ )

Если вы хотите игнорироватьошибки некоторых get_options можно просто изменить:

return get_options(item.id).catch(err => {return null})

, а затем использовать функцию .filter в optionsResult:

.then((optionsResult) => optionsResult.filter(_ => _!==null))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...