我在这样的循环中调用异步函数(例如上传文件列表):
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?
不,不会。如果您想中断循环,则必须使用 break
或 return
来完成。
但作为一个单独的问题,还存在一些其他问题:
该代码中没有理由使用
new Promise
。async
函数返回 Promise,无需包装它们。使用带有解决方案的错误标志通常不是最佳实践。使用拒绝来表示失败,而不是使用错误代码完成。
所以:
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/