Цикл с обещаниями в JS - PullRequest
       11

Цикл с обещаниями в JS

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

Я пытаюсь выполнить запросы внутри цикла for в nodejs, и каждая итерация цикла for выполняет один запрос.Запросы выполняются методом get (), который возвращает Promise.В моей функции (которая содержит это для цикла) я возвращаю обещание, возвращенное методом get (), примерно так:

for(var i=0; i < productIds.length; i++) { return queryObject.get(productIds[i]).then(//handle result) }

, но возвращается после первой итерации и непродолжаем до конца итераций.Как мне решить эту проблему?

Для контекста я использую облачные функции Parse.

Ответы [ 3 ]

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

Две возможности, параллельная и последовательная.Я покажу оба:

async function serial(productIds) {
  for(const productId of productIds) {
      await queryObject.get(productId).then(//handle result)
  }
}

function parallel(productIds) {
  return Promise.all(
     productIds.map( productI => queryObject.get(productId).then(//handle result)
  );
}
0 голосов
/ 27 сентября 2018

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

Сначала давайте разберемся, почему ваш код не выполняет то, что вы хотите:

for(var i=0; i < productIds.length; i++) {
    return queryObject.get(productIds[i]).then(//handle result)
}

Вы хотитекод для запуска каждого productId;однако вы говорите, что код должен возвращаться, выходя из цикла for, в самой первой итерации.Подумайте о следующем:

for(var i=0; i < productIds.length; i++) {
    return productIds[i];
}

Удаление обещаний с картинки облегчает обнаружение ошибки.Этот цикл for эквивалентен:

return productIds[0];

Аналогично, ваш код эквивалентен:

return queryObject.get(productIds[0]).then(//handle result)

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

Я возвращаю обещание, возвращенное методом get (), примерно так:

Вы ссылаетесь на одно обещание, возвращенное из "the"вызовите метод get (), но вы на самом деле надеетесь вызвать метод get () много раз, создавая много обещаний .

Если все это имеет смысл, тогда ваш следующий шаг - решить:

  1. Вам нужно запустить код после того, как ВСЕ обещания будут выполнены (при этом используется полный список найденных данных).
  2. Вам нужно запускать код только для выполненного обещания (в котором используются только данные, полученные из конкретного обещания).

Вы достигли # 1, используя цепочку обещаний, как показано в TLPответ.Вы можете достичь # 2, просто удалив «return» из своего кода, а именно:

for(var i=0; i < productIds.length; i++) {
    queryObject.get(productIds[i]).then(//handle result)
}
0 голосов
/ 27 сентября 2018

Вы должны построить цепочку обещаний примерно так:

let chain = Promise.resolve();

for (i=0; i<1000; i++) {
   chain = chain.then(()=>queryObject.get(objectId))
}

chain.then(()=>{ /* do something once all queries have returned a result */})
...