Node.js:在parsing()被调用之前parsingPromise?

我对Node.js及其asynchronous行为很陌生。

我试图拿一个文件,保存它的副本,追加一行到复制的文件,并开始使用复制的文件 – 按顺序。

这大概是我现在所拥有的…

var first = new Promise(function(resolve, reject) { console.log("1"); var readStream = fs.createReadStream("file.txt"); var writeStream = fs.createWriteStream("file-copy.txt"); readStream.on("end", function () { writeStream.end(); }); var pipeAction = readStream.pipe(writeStream); pipeAction.on("close", function() { console.log("2"); resolve(); }); }); var second = new Promise(function(resolve, reject) { console.log("3"); fs.appendFile("file-copy.txt", "\nA NEW LINE TO INSERT", function (err) { }); console.log("4"); resolve(); }); var third = new Promise(function(resolve, reject) { // do something with the modified, copied file console.log("5"); }); first.then(second).then(third); 

输出显示1 3 4 5 2,而不是1 2 3 4 5.任何人都可以分享一些为什么“第一”在“2”打印之前能够解决的灯?

谢谢!

您正在使用承诺错误。 在你的例子中,你立即调用你的承诺。 由于他们的执行函数(带有resolve / reject参数的callback函数)在实例化的时候被调用,所以你立即logging1,3,4和5.由于console.log('2')被封装在一个asynchronous行动的callback,它被推迟,最终被称为最后。

实现你正在尝试的正确方法是将你的variables设置为函数本身,并return你的承诺。 这样,当你的firstsecondthird函数被调用时,他们立即调用它们的执行者并开始控制stream程。 你必须return承诺,否则你将打破承诺链。

 function first() { return new Promise(function(resolve, reject) { console.log("1"); var readStream = fs.createReadStream("file.txt"); var writeStream = fs.createWriteStream("file-copy.txt"); readStream.on("end", function() { writeStream.end(); }); var pipeAction = readStream.pipe(writeStream); pipeAction.on("close", function() { console.log("2"); resolve(); }); }); } function second() { return new Promise(function(resolve, reject) { console.log("3"); fs.appendFile("file-copy.txt", "\nA NEW LINE TO INSERT", function(err) { }); console.log("4"); resolve(); }); } function third() { return new Promise(function(resolve, reject) { // do something with the modified, copied file console.log("5"); }); } first().then(second).then(third); 

产量:

 1 2 3 4 5 

这里有一个工作版本来玩弄:

 function first() { return new Promise((resolve, reject) => { console.log(1); // async request setTimeout(() => { console.log(2); resolve(); }, 1000); }); } function second() { return new Promise((resolve, reject) => { console.log(3); // async request setTimeout(() => { console.log(4); resolve(); }, 1000); }); } function third() { return new Promise((resolve, reject) => { console.log(5); resolve(); }); } first() .then(second) .then(third);