angular - 发生错误时如何跳出循环
问题描述
我试图在错误响应中跳出 for 循环并控制台错误消息。这是我尝试过的
var error = 0;
var errorMsg;
for (let i = 0; i < this.fileArray.length; i++) {
if ( this.fileArray[i] != undefined ) {
if ( error == 0 ) {
const fd = new FormData()
fd.append('file', this.fileArray[i], this.fileArray[i].name)
this.data.ImgUploader(fd).subscribe(
res => {
if ( res['code'] != '00' ) { //error occurred. 1 is assigned to var error
error = 1
errorMsg = res['message']
} else {
error = 0
}
}
)
} else {
console.log(errorMsg)
break;
}
}
}
我通过ImgUploader
函数发送一些图像文件并通过回调接收响应。我试图通过错误代码观察错误并分配1
给变量error
。我现在期望变量error == 1
,但代码仍然进入代码块 where error == 0
. 请问我哪里出错了。谢谢。
解决方案
您无法从传递给的回调中跳出循环subscribe
。循环结束后调用回调。
JavaScript 代码在单个线程上运行。这就是为什么在您的代码片段中首先执行所有循环迭代的原因。由于error
始终具有值 0,error == 0
因此在所有循环迭代中都将为真。的回调subscribe
只能在循环完成后执行。此时error
变量的值发生了变化,但没有任何区别,因为循环已经完成。
如果您想了解更多浏览器引擎盖下发生的事情,我推荐这个演讲:https ://www.youtube.com/watch?v=8aGhZQkoFbQ
推荐阅读
- github-pages - 推送 github 存储库时出错
- git - 无法在 github 中镜像 git repo
- sql-server - 如何计算 SQL Server 中每秒的 DML/DQL 请求数
- javascript - 定义变量时的意外行为
- mysql - 如何按时间分组,如果mysql中没有数据计数为零?
- pdf - 如何在 puppeteer 中将多个 pdf 合并为一个 pdf?
- laravel - 我想验证数据库 laravel 8 中是否不存在数据
- android - 将硬编码字符串转换为字符串资源
- c# - 获取字典列表中的值计数
- python - 如何使用字符串布尔表达式过滤列表