nodejs / js:文本未按顺序附加在文件中

时间:2017-05-19 10:35:16

标签: javascript node.js

我正在尝试在使用expressunirestasync模块的代码块中编写状态信息日志,如下所示。

const fsTest = require("fs");

app.post(someURL, function (req, res) {
    fsTest.appendFile("c:/fs.txt","\r\nInOf")   
    async.series({
        one: function (callback) {
                fsTest.appendFile("c:/fs.txt","\r\nInOf2")
                someOperation();        
                fsTest.appendFile("c:/fs.txt","\r\nInOf3")
                callback(false,"");         
        },
        //form search query
        two: function (callback) {
            fsTest.appendFile("c:/fs.txt","\r\nInOf4")
            anotherOperation();
            urClient.post("https://" + server + url)
                .header('Content-Type', 'application/json')             
                .send(qrySearchJSON)
                .end(
                    function (response) {
                    });
        }
    },  function (err,oResp) {
            errHandler();
        });
});

但我的日志总是不按顺序出现,如下所示:

InOf2
InOf4
InOf3
InOf

InOf
InOf2
InOf3
InOf4

InOf
InOf2
InOf4
InOf3

InOf2
InOf
InOf4
InOf3

InOf
InOf2
InOf3
InOf4

可能是什么原因以及我应采取什么方法来解决它。

1 个答案:

答案 0 :(得分:1)

那是因为fs.appendFile()是异步的。另一方面,您将其视为同步运行。

最简单(不是最好)的解决方案是使用fs.appendFileSync() - 它会按照您的预期行事。

如果处理appendFile的异步性质会更好。像这样:

const fsTest = require("fs");

app.post(someURL, function (req, res) {
    fsTest.appendFile("c:/fs.txt","\r\nInOf")   
    async.series({
        one: function (callback) {
                appendFile("c:/fs.txt","\r\nInOf2").then(function(){
                    someOperation();
                    return appendFile("c:/fs.txt","\r\nInOf3");
                }).then(function(){
                    callback(false,"");         
                }).catch(function(err){})
        },
        //form search query
        two: function (callback) {
            appendFile("c:/fs.txt","\r\nInOf4").then(function(){
                anotherOperation();
                urClient.post("https://" + server + url)
                    .header('Content-Type', 'application/json')             
                    .send(qrySearchJSON)
                    .end(
                        function (response) {
                        });
            }).catch(function(err){});
        }
    },  function (err,oResp) {
            errHandler();
        });
});

function appendFile(file, content) {
    var promise = new Promise(function(resolve, reject) {
        fsTest.appendFile(file, content, function(err) {
            if (err) {
                reject(err);
            } else {
                resolve();
            }
        });
    });

    return promise
}

您可以使用async / await或者生成器 看看co npm模块 - 它做了一些奇特的东西。