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

标签 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....
  }
}

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

最佳答案

Will resolve in promise loop break loop iteration?

不,不会。如果您想中断循环,则必须使用 breakreturn 来完成。

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

  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
})();

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

类似地,myAsyncFunction A) 不应该是 async 函数,或者 B) 不应该使用 new Promise。请参阅What is the explicit promise construction antipattern and how do I avoid it?

最后,这是可疑的:

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

除非有非常充分的理由,myAsyncFunction 在出现问题时应该拒绝而不是履行其 promise 。 (数十万个使用 fetch 而不检查 response.ok 的错误代码示例就证明了这一点。)

关于javascript - 会在promise循环中解决break循环迭代吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55207256/

相关文章:

javascript - 使用多个过滤器过滤对象数组

javascript - 我有几组 promise ,如何解析每组 "sequentially"?

javascript - 等待 Promise 内的异步函数

javascript - 为什么javascript ES6 Promises在解决后继续执行?

javascript - 通过socket.io 获取数据。设置: token; error: invalid credentials

javascript - 如何使用另一个功能停止一个功能

javascript - 处理复杂 Web 界面的 javascript 事件

javascript - 如何拥有图像工具栏?

javascript - 使用 Node.js/promises 按类型捕获异常

javascript - Vue JS Promise 顺序与并行