【问题标题】:How to break from for loop in javascript?如何打破javascript中的for循环?
【发布时间】:2021-06-06 08:53:17
【问题描述】:

我知道这个问题已经被问过很多次了,但奇怪的是其他帖子中的答案并没有解决我的问题:

handleFile(files) {
    var f = files[0]   
    var dataSet = JSZip.loadAsync(f).then(function (zip) {
        for (var filename in zip.files) {
            const one_dicom_file = zip.files[filename]
            console.log('--------- one_dicom_file ----------', one_dicom_file)

            try {
                one_dicom_file.async("arraybuffer").then(function (ArrayBuffer) {
                    var byteArray = new Uint8Array(ArrayBuffer);
                    var dataSet = dicomParser.parseDicom(byteArray);
                    console.log(filename, 'parsed dataSet: ', dataSet);
                    return dataSet

                // EDIT: OP is Missing close curly bracket here!!

            } catch (error) {
                console.error(error);
            }
            console.log('check 1')
        }
    }, function (e) {
        console.log(e)
    });
}

我正在遍历一个 zip 文件的内容,当遇到第一个 dicom 文件(一种医学图像格式)时,我使用库调用 dicomParser.parseDicom() 对其进行分析。

成功执行此功能后,我想立即退出迭代。出于性能考虑,可以忽略其他 dicom 文件。

但是,上面的代码将为每个 dicom 文件打印console.log(filename, 'parsed dataSet: ', dataSet);return dataSet 行对 for 循环没有任何作用。此外,每个 dicom 文件都会打印check 1

我也尝试将return dataSet 替换为break,在这种情况下会抛出错误Unsyntactic break

其他答案声称 returnbreak 都应该停止 for 循环,但他们没有。

我对 javascript 很陌生,如果这是个愚蠢的问题,我很抱歉。我习惯了python,javascript语法太复杂了……

【问题讨论】:

  • 你在 for 循环中既没有 break 也没有 return ... return 不在 for 循环中,它在 for 循环内调用的函数中,所以,对 for 循环没有任何作用 - 你的缩进隐藏了这个事实
  • 说实话,您发布的代码在语法上并不正确 - try.then(function(ArrayBuffer){ 回调之外,而 catch 在其中 - 请发布以下代码语法正确
  • 我编辑了缩进以明确 OP 缺少右括号
  • 啊,我真傻....
  • 您应该使用async/await 而不是.then() 才能跳出循环(并首先按顺序进行迭代)

标签: javascript for-loop


【解决方案1】:

您使用.then(function (ArrayBuffer) { } 传递的回调函数将异步执行

这意味着,您的程序将继续流程并且不等待其执行和结果。因此,您不能将此函数的结果用作退出循环的条件。无论该函数内部发生了什么,程序都会进入下一个循环。

为了根据函数的结果来决定是否中断循环,你必须阻塞程序流直到函数完成。

我建议你看看await 关键字和功能。网络上有大量关于它的教程,例如 herehere


我不知道您调用的函数的详细信息,但它可能看起来像这样:

async function handleFile(files) {
    var f = files[0]   
    var zip = await JSZip.loadAsync(f)
    for (var filename in zip.files) {
        const one_dicom_file = zip.files[filename]
        console.log('--------- one_dicom_file ----------', one_dicom_file)
        try {
            var arrayBuffer = await one_dicom_file.async("arraybuffer")
            var byteArray = new Uint8Array(arrayBuffer)
            var dataSet = dicomParser.parseDicom(byteArray)
            console.log(filename, 'parsed dataSet: ', dataSet)
            return dataSet
        } catch (error) {
            console.error(error)
        }
    }
}

请注意,您只能在 async 的函数中使用 await,因此您需要将您的 handleFile 转换为异步函数。

然后,每当您调用此函数时,如果您要等待它,则相应的调用站点函数也必须是异步的。等等,等等……比如virus,或者matryoska doll

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2022-12-15
    相关资源
    最近更新 更多