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;循环调用吗?
会在promise循环中解决break循环迭代吗?
不,不会的。如果你想打破循环,你必须使用breakor来做到这一点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
})();
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就证明了这一点。)