我对 Node.js 及其异步行为非常陌生。
我正在尝试获取一个文件,保存它的副本,在复制的文件中附加一行,然后开始使用复制的文件 - 按此顺序。
这大概就是我现在所拥有的......
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。任何人都可以分享一些关于为什么“first”能够在打印“2”之前解析的信息吗?
谢谢!
最佳答案
您正在使用promises错误地。在你的例子中,你立即调用你的 promise 。由于它们的执行器函数(带有 resolve
/reject
参数的回调)在实例化 Promise 时被调用,因此您将立即记录 1、3、4 和 5。由于 console.log('2')
包含在异步操作的回调中,因此它被推迟并最终被最后调用。
实现您尝试的正确方法是将变量设置为函数本身并返回
您的 promise 。这样,当调用 first
、second
和 third
函数时,它们会立即调用其执行器并启动控制流。不过,您必须返回
promise ,否则您将破坏 promise 链。
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);
关于javascript - Node.js:在调用resolve()之前解决了Promise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38277209/