会在promise循环中解决break循环迭代吗?

111*_*110 3 javascript promise es6-promise

我在这样的循环中调用异步函数(例如上传文件列表):

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....
  }
}
Run Code Online (Sandbox Code Playgroud)

如果在一个也在承诺中的循环中,我调用resolve()将循环继续迭代,否则它将停止在那里。
基本上,如果我在此之前解决,我需要break;循环调用吗?

T.J*_*der 5

会在promise循环中解决break循环迭代吗?

不,不会的。如果你想打破循环,你必须使用breakor来做到这一点return

但作为一个单独的事情,还存在其他一些问题:

  1. 该代码中没有任何理由new Promiseasync函数返回 Promise,无需包装它们。

  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
})();
Run Code Online (Sandbox Code Playgroud)

(这看起来有点尴尬。如果您提供更多上下文,也许可以让它看起来不那么尴尬。)

同样,myAsyncFunctionA) 不应该是async函数,或者 B) 不应该使用new Promise. 请参阅什么是显式承诺构造反模式以及如何避免它?

最后,这是可疑的:

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

除非有很好的理由,myAsyncFunction否则当出现问题时应该拒绝而不是履行其承诺。(数十万个fetch未经检查而使用错误代码的例子response.ok就证明了这一点。)