Как я могу отправить данные в массив внутри обещания тогда? - PullRequest
0 голосов
/ 04 сентября 2018

Я пытался выяснить. Как я могу отправить результат в массив из цикла обещаний. Кто-нибудь может указать мне в нужном месте?

const ids = [1, 2, 3]
let results = []

for (let id of ids) {
    getLight(id)
        .then(light => {
            results.push(light)
        })
        .catch(err => {
            console.log(err)
        })
}

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

const ids = [1, 2, 3]
let results = []

Promise.all(
  ids.map((id) =>
    getLight(id)
    .then(light => {
      results.push(light)
    })
    .catch(err => {
      console.log(err)
    })
  )).then(() => console.log(results))

function getLight(id) {
  return new Promise((res) => {
    setTimeout(res, 1000)
  }).then(() => `light for id: ${id}`)
}

с асинхронным ожиданием

(async() => {

  const ids = [1, 2, 3]
  let results = await Promise.all(
    ids.map((id) =>
      getLight(id))
  )

  console.log(results);
})()

function getLight(id) {
  return new Promise((res) => {
    setTimeout(res, 1000)
  }).then(() => `light for id: ${id}`)
}
0 голосов
/ 04 сентября 2018

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

const ids = [1, 2, 3]
Promise.all(ids.map(id => getLight(id))).then(results => {
  // do something with results here
})

Разбить это:

  1. ids.map(id => getLight(id)) преобразует идентификаторы в массив из неразрешенных обещаний.

  2. Promise.all(promises).then(results => { ... }) разрешает все обещания и передает результаты (в правильном порядке) обратному вызову

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...