Разрешит ли в итерации цикл прерывания цикла? - PullRequest
0 голосов
/ 17 марта 2019

Я выполняю вызов асинхронной функции в цикле, подобном следующему (что-то вроде загрузки списка файлов):

return new Promise(async function(resolve, reject) { 
  for (let i = 0; i < list.length; i++) {
    let response = await myAsyncFunction();
    if (response.ok === false) {
      resolve({error: "Something goes wrong"});
      // break; - is this required?
    }
  }
}
async function myAsyncFunction() {
  return new Promise(async function(resolve, reject) {
     resolve code....
  }
}

Если в цикле, который также находится в обещании, я вызываю resolve(), цикл продолжит повторяться или остановится.
В основном мне нужно вызывать break; в цикле, если я решу до этого?

Ответы [ 2 ]

2 голосов
/ 17 марта 2019

Разрешит ли в итерации цикл прерывания цикла обещания?

Нет, не будет.Если вы хотите разорвать цикл, вы должны сделать это с помощью break или return.

Но, как отдельная вещь, здесь есть пара других проблем:

  1. В этом коде нет причины для new Promise.async функции возвращают обещания, не нужно их оборачивать.

  2. Использование флага ошибки с разрешением обычно не является наилучшей практикой.Используйте отклонение , чтобы сообщить о неудаче, а не выполнение с кодом ошибки.

Итак:

return (async function(resolve, reject) { 
  for (let i = 0; i < list.length; i++) {
    let response = await myAsyncFunction();
    if (response.ok === false) { // I'd use `if (!response.ok) {`
      throw new Error("something goes wrong");
    }
  }
  // Presumably return something here
})();

(То естьвыглядит немного неловко. Если вы предоставите больше контекста, возможно, можно будет сделать его менее неловким.)

Аналогично, myAsyncFunction либо A) Не должно быть функцией async, либо B)Не следует использовать new Promise.См. Что такое явное обещание построения antipattern и как мне его избежать?

Наконец, это подозрительно:

let response = await myAsyncFunction();
if (response.ok === false) { // I'd use `if (!response.ok) {`
  throw new Error("something goes wrong");
}

Если нет очень веская причина, myAsyncFunction должен отклонить, а не выполнить свое обещание в случае возникновения проблемы.(Сотни тысяч примеров неправильного кода, использующего fetch без проверки response.ok, свидетельствуют об этом.)

0 голосов
/ 17 марта 2019

Не используйте конструкторы Promise & async function s одновременно.Это вызовет только такие головные боли, как эта.Просто используйте асинхронную функцию, и тогда становится ясно, что вы можете просто return:

 return (async function() { // IIFE is all you need, will result in a Promise itself
   for (let i = 0; i < list.length; i++) {
     let response = await myAsyncFunction();
     if (response.ok === false) {
       return {error: "Something goes wrong"};
     }
   }
})();

Читать

...