首页 > 解决方案 > 将在承诺循环中断循环迭代中解决吗?

问题描述

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

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;循环调用吗?

标签: javascriptpromisees6-promise

解决方案


将在承诺循环中断循环迭代中解决吗?

不,它不会。如果你想打破循环,你必须用breakor来做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. 请参阅什么是显式承诺构造反模式以及如何避免它?

最后,这是可疑的:

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

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


推荐阅读