我正在尝试在使用express
,unirest
和async
模块的代码块中编写状态信息日志,如下所示。
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
可能是什么原因以及我应采取什么方法来解决它。
答案 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模块 - 它做了一些奇特的东西。