将在答应循环,中断循环迭代中解决吗?

时间:2019-03-17 12:52:30

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

如果在一个也有承诺的循环中,我调用resolve()将使循环继续进行迭代或停止于此。
基本上,如果我在此之前解决,是否需要循环调用break;

3 个答案:

答案 0 :(得分:2)

  

将解决Promise循环中断循环迭代吗?

不,不会。如果要打破循环,则必须使用breakreturn来完成。

但作为另一件事,那里还有其他一些问题:

  1. 该代码中没有理由使用new Promiseasync函数返回承诺,无需包装它们。

  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在出现问题时应该拒绝而不是兑现其承诺。 (使用fetch而不检查response.ok的数十万个错误代码示例证明了这一点。)

答案 1 :(得分:1)

Resolve将破坏循环,甚至嵌套循环,正如我从这段代码中看到的:

function loops() {
  return new Promise((resolve, reject) => {
    for (let i = 0; i < 10; i++) {
      for (let j = 0; j < 10; j++) {
        if (j === 1) {
          resolve("first");
        }

        if (j === 5) {
          resolve("second");
        }
      }
    }
    resolve("third");
  });
}

async function execute() {
  let test = await loops();
  console.log(test);
}

execute();

答案 2 :(得分:0)

请勿同时使用Promise构造函数和sp_MSfetchAdjustidentityrange。那只会引起像这样的头痛。只需使用一个异步函数,那么很明显您实际上可以async function

return

Read on