Electronjs 应用异步/等待不等待从函数返回数据

时间:2020-12-26 08:15:07

标签: javascript node.js electron

我是 Electron nodejs 应用程序的新手。我使用 ipcRenderer.on 调用从 html 调用 main.js。 main.js 中的代码如下,我读取文件夹数组,从每个文件夹中获取文件并从每个文件中读取内容以进一步处理。现在的问题是main函数没有等待content read函数返回数据。

ipcMain.on('worker', async (event, arg) => {
    for (let x = 0; x < folders.length; x++) {
        event.reply("dex-worker", dexFolders[x].path);
        // Scan folders for files
        fs.readdir(folders[x].path, (err, files) => {
            // Process files
            files.forEach(async (file) => {
            event.reply("worker", file.toString()); // THIS WORKS
            var fdata = await readData(files[x].path + path.sep + file); // DOES NOT WAIT for RETURN
            console.log(fdata); // displays 'undefined'});
        });
    }
});

async function readData(fi) {
    var _fdata = "";
    fs.readFile(fi, 'utf8', function (err, data) {
        if (err) {
            console.log(err);
        }
        _fdata = data;
        return (_fdata);
    });
}

我阅读了许多关于 async/await 和 promise 的帖子和文档。但我不明白他们是在一起还是替代。请帮忙。

1 个答案:

答案 0 :(得分:1)

您可以使用回调来正确获取数据。

ipcMain.on('worker', async (event, arg) => {
  for (let x = 0; x < folders.length; x++) {
    event.reply("dex-worker", dexFolders[x].path);
    // Scan folders for files
    fs.readdir(folders[x].path, (err, files) => {
      // Process files
      files.forEach(async (file) => {
        event.reply("worker", file.toString()); // THIS WORKS
        readData(files[x].path + path.sep + file, (err, data) => {
          if (err) {
            console.log(err);
          }
          console.log(data);
        });
      });
    })
  }
});

function readData(fi, callback) {
  fs.readFile(fi, 'utf8', callback);
}