javascript - 将在承诺循环中断循环迭代中解决吗?
问题描述
我在这样的循环中调用异步函数(比如上传文件列表):
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;
循环调用吗?
解决方案
将在承诺循环中断循环迭代中解决吗?
不,它不会。如果你想打破循环,你必须用break
or来做return
。
但作为一个单独的事情,还有其他几个问题:
new Promise
在该代码中没有理由。async
函数返回承诺,无需包装它们。使用带分辨率的错误标志通常不是最佳实践。使用拒绝表示失败,而不是使用错误代码完成。
所以:
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
就使用错误代码的例子证明了这一点。)
推荐阅读
- python - AWS Lambda 函数未执行所有 Python 代码但也未收到错误
- ios - 检查 CAShapeLayer 是否在 UIBezierPath 中
- sql - SQL分组并计算同一表中行的交集?
- c++ - 将 NDK 与其他构建系统一起使用时出现问题
- kubernetes - 如何在 Istio-Ingressgateway 的受信任 CA 列表中添加 CA 根?
- python - Pandas 有没有办法分割多个日期时间值?
- javascript - 如何根据 3 个选择下拉列表的值过滤 React 状态?
- java - 在gmail api get message中,如何在获取当前消息时防止获取上一个消息链?
- python - 使用聚合的散景更新源
- python - 如何在不立即执行的情况下通过函数调用传递 kwargs