javascript - 异步任务完成后写入文件

标签 javascript node.js asynchronous

我编写了以下代码来创建一个对象,其中 KEYS 设置为注释标题,VALUES 设置为共享这些标题的文件。如果没有 header ,文件名将写入文件。我想将此 header 对象写入文件,但它是在对象完成之前写入的。我明白为什么会这样,但我似乎无法解决这个问题。下面是将对象写入文件的代码:

stringObj = JSON.stringify(allHeaders, null, 4);
    fs.writeFile(currentHeads, stringObj, function(err) {
        if (err) {
            console.log(err);
        }
    });
    console.log('Complete!');

这是脚本的其余部分:

    "use strict";

var fs = require('fs'),
    dive = require('dive'),
    subdirs = require('subdirs'),
    cpFile = __dirname + "/" + "header.txt",
    noCopy = __dirname + "/" + "noCopyright.txt",
    currentHeads = __dirname + "/" + "currentHeaders.txt",
    re = /(\/\*(?:(?!\*\/).|[\n\r])*\*\/)/, // matches first multi-line comment
    walkDir,
    allHeaders = {},
    stringObj,
    top;


fs.readFile(cpFile, 'utf8', function(err, copyRight) {
    subdirs(__dirname, 1, function(err, dirs) {
        if (err) {
            return console.log(err);
        }
        dirs.forEach(function(dir) {
            if (dir.match(/.*\/src$/)) {
                dive(dir, { all: false }, function(err, file) {
                    if (err) {
                        return console.log(err);
                    }
                    fs.readFile(file, 'utf8', function(err, data) {
                        if (err) {
                            return console.log(err);
                        }
                        if (data.match(re)) {
                            top = data.match(re);
                            if (allHeaders[top[0]]) {
                                allHeaders[top[0]].push(file);
                            } else {
                                allHeaders[top[0]] = [file];
                            }
                        } else {
                            fs.appendFile(noCopy, file + "\n", function(err) {
                                if (err) {
                                    return console.log(err);
                                }
                            });
                        }
                    });
                });
            }
        });
    });
});

最佳答案

我认为问题在于您在同步 (dirs.forEach) 中使用了异步函数 (dive),并且您代码中的下一个函数(将 allHeaders 写入文件)执行得更早,然后所有指令才被实际处理。

要解决此问题,您可以使用“async”模块,例如:

async.each(dirs, function(dir, next) {
  // process dir here, in case of error call return next(err), otherwise call return next();
}, function(err) {
   // process err somehow
   // if there is no error, all directives are processed, write allHeaders to file

   stringObj = JSON.stringify(allHeaders, null, 4);
   fs.writeFile(currentHeads, stringObj, function(err) {
     if (err) {
        console.log(err);
     }

     console.log('Complete!');
   });
});

关于javascript - 异步任务完成后写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33311522/

相关文章:

sql - 如何等待异步完成 - NodeJs

python - 在循环完成之前从 python 协程收集结果

javascript - onCenterChange 回调返回未定义的@react-google-maps/api

javascript - 主要的 JavaScript 数据结构

node.js - 如何在 Windows 上安装旧版本的 node.js?

json - 解析扭曲数据接收中的数据

javascript - 无法让 Firebase 数据在简单的 Vue 应用程序上显示

javascript - Nodemailer 包括通过数组迭代表

node.js - 使用 powershell 登录 firebase

javascript - Javascript async 和 await 是否等同于多线程?