0

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

有问题的文件是一个非常大的文件,所以我正在考虑使用异步读取。

预期行为:

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

错误:即使等待失败,任何错误都应该被 catch 块捕获。console.log() 应该表明它被捕获了。

Observed:await 失败,完全跳过 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();
4

1 回答 1

0

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

  1. 您的代码执行await readFile(fileName, 'utf-8');并且uploadFile()函数被挂起并立即返回一个承诺。
  2. console.log("Done")运行
  3. process.exit(0)运行。
  4. 该文件尚未被读取,您的程序已退出。

相反,您可以执行以下操作:

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)

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

于 2021-05-17T18:58:52.677 回答