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
你的承诺。 这样,当你的first
, second
和third
函数被调用时,他们立即调用它们的执行者并开始控制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);