Node.js NodeJS:等待跳过捕捉块并退出函数。为什么?

Node.js NodeJS:等待跳过捕捉块并退出函数。为什么?,node.js,debugging,async-await,try-catch,node-promisify,Node.js,Debugging,Async Await,Try Catch,Node Promisify,这是我的第一个问题,请给我反馈 所讨论的文件是一个非常大的文件,因此我考虑使用异步读取 预期行为: 成功:“等待”将导致代码执行阻塞,直到文件被读取 错误:即使等待失败,任何错误都应该被catch块捕获。console.log()应该指示正在捕获它 观察到:等待失败,完全跳过catch块,在Main的下一行继续执行。跳过整个异步函数。在调试器中,我可以看到结果中正确的输出仅在一瞬间出现,然后直接从函数中输出 有人能告诉我为什么会发生这种情况以及我如何解决它吗? 我的理解是,如果发生异常,catc

这是我的第一个问题,请给我反馈

所讨论的文件是一个非常大的文件,因此我考虑使用异步读取

预期行为:

成功:“等待”将导致代码执行阻塞,直到文件被读取

错误:即使等待失败,任何错误都应该被catch块捕获。console.log()应该指示正在捕获它

观察到:等待失败,完全跳过catch块,在Main的下一行继续执行。跳过整个异步函数。在调试器中,我可以看到结果中正确的输出仅在一瞬间出现,然后直接从函数中输出

有人能告诉我为什么会发生这种情况以及我如何解决它吗? 我的理解是,如果发生异常,catch块将始终捕获它。请尽可能详细和清晰地解释,我仍在努力掌握NodeJS语言

被注释掉的那一行是我认为做同样任务的另一种方式。它也面临同样的问题。它甚至跳过了一个“最终”块,而我也有一个

此外,Main中的“c”变量是调试器中的“挂起”承诺

最后,此代码的总体目的是以文本形式解析JSON文件。这只是一个更大文件的MVCE

const fs = require('fs');
const util = require('util');

async function uploadFile(fileName) {
    try {
        const readFile = util.promisify(fs.readFile);
        result = await readFile(fileName, 'utf-8');
        //result = await fs.readFileSync(fileName, 'utf-8');
        jsonObj = JSON5.parse(result);
    }
    catch (err) {
        console.log(err);
    }
}

function Main() {
    fileName = './Diagnostics_Data_Analysis/AddingToDynamoDB/diag.txt';
    var c = uploadFile(fileName);
    console.log("Done");
    process.exit(0);
}

Main();

wait
不阻塞。它暂停本地函数和该函数的执行,然后立即返回一个承诺。调用方需要使用该承诺来知道操作何时完成。实际上,在文件读取完成之前,您正在调用
process.exit()
。这里发生的是:

  • 您的代码执行
    wait readFile(文件名为“utf-8”)
    uploadFile()
    函数被挂起并立即返回承诺
  • console.log(“完成”)
    运行
  • 进程。退出(0)
    运行
  • 文件尚未读取,您的程序已退出
  • 相反,您可以这样做:

    async function Main() {
        const fileName = './Diagnostics_Data_Analysis/AddingToDynamoDB/diag.txt';
        const c = await uploadFile(fileName);
        console.log("Done");
        process.exit(0);
    }
    
    这将等待
    uploadFile()
    函数在调用
    process.exit(0)
    之前实际通知完成

    p.S.Nodejs现在已经内置了
    fs
    库的promise版本,因此您可以使用
    fs.promises.readFile()
    ,而不必制作自己的promisified版本