我正在尝试以 a+ 模式打开 2 个文件,然后尝试读取它们的内容并将其发送回用户。我使用嵌套回调实现了它,但我想尝试使用 Promises 来实现它,因此我编写了以下内容:
var chain1 = [];
var c1Promise1 = new Promise(func(res,rej){
fs.open('path','a+',func(err,fd){
if(err)
{rej(err)}
else
{res(fd)}
})
chain1.push(c1Promise1)
//Same thing for the second promise, just different path
Promise.all(chain1).then(fds=>{
var chain2 = []
var c2Promise1 = new Promise(func(res,rej){
fs.readFile(fds[0],'utf-8',func(err,data){
console.log("data1 = " + data)
if(err){
rej(err)
}
else{
res(data)
}
})
})
chain2.push(c2Promise1)
//Same thing for c2Promise2 but different fd (fds[1]) and .log("data2 = " + data)
Promise.all(chain2).then(data=>{
console.log("data3 and 4 = " + data[0] + ' ' + data[1])
},err=>next(err))
},err=>next(err))
On console i get:
"data3 and 4" = undefined undefined
"data1 = " actual data in the file
"data2 = " actual data in the file.
我错过了什么吗?这不是应该表现得像 data1、data2 然后只有 data 3 和 4!?感谢您的帮助
最佳答案
Promise.all()
立即返回,不等待 Promise 完成。
因此,在您的情况下,第一个 Promise.all
下面的所有内容都应该位于 .then()
block 中。
顺便说一下,这种代码很难阅读。您可以尝试使用直接处理 Promise 的 fs = require('mz/fs')
。也许可以使用 async/await。
类似于:
让 fs = require('ms/fs');
让 data1 =等待 fs.readFile(path1, 'utf8');
让 data2 =等待 fs.readFile(path2, 'utf8');
关于javascript - 按 "wrong"顺序执行的嵌套 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44203820/