var fs = require('fs');
var promise = new Promise(function(resolve, reject) {
fs.readFile('file1.txt', 'utf-8', (err, data) => {
resolve(data);
});
})
promise.then(function(value) {
fs.readFile('file2.txt', 'utf-8', (err, data) => {
return data + value;
});
}).then(function(value) {
console.log(value) //先执行了
})
我本意是期望读取2个文件,然后打印2个文件的内容,可是似乎最后的console.log先于读取file2执行了... 请问正确的应该怎么写,看了一些promise文章也没搞明白。。。
回复 (11)
O
你的问题是那里没有return,因为Promise是链式的,所以每一个then里面都要return一下,你那个return在fs里的回调函数里面,当然不行了,异步读取什么时候完成不可控,你想获取两个的话可以用promise.all就好了
W
引用 oyosc你的问题是那里没有return,因为Promise是链式的,所以每一个then里面都要return一下,你那个return在fs里的回调函数里面,当然不行了,异步读取什么时候完成不可控,你想获...
@oyosc 多谢,不过加了return也不行,我打断点,发现console.log先于return data+value执行的……
O
引用 wdwwtzy@oyosc 多谢,不过加了return也不行,我打断点,发现console.log先于return data+value执行的……
@wdwwtzy 没注意到,你直接 fs.readFile('2.txt', 'utf-8', (err, data) => { console.log(data+value); });
这样就可以了呀...
W
引用 oyosc@wdwwtzy 没注意到,你直接 fs.readFile('2.txt', 'utf 8', (err, data) = { console.log(data+value); }); 这样就...
@oyosc 额 我是个举例,肯定是后续还有复杂的操作....
O
好吧,你要继续往后面then的话就需要在file2那再写个promise,建议你直接Promise.all,这样方便多了
B
var fs = require('fs');
var promise = new Promise(function(resolve, reject) {
fs.readFile('1.txt', 'utf-8', (err, data) => {
resolve(data);
});
})
promise.then(function(value) {
return new Promise(function(resolve, reject) {
fs.readFile('2.txt', 'utf-8', (err, data) => {
resolve(data + value);
});
});
}).then(function(value) {
console.log(value)
})
或者
var fs = require('fs');
Promise.all([
new Promise(function(resolve, reject) {
fs.readFile('1.txt', 'utf-8', (err, data) => {
resolve(data);
});
}),
new Promise(function(resolve, reject) {
fs.readFile('2.txt', 'utf-8', (err, data) => {
resolve(data);
});
})
]).then(function(value) {
console.log(value.join(""));
});
T
then和then里面的异步理解的偏差。。。
W
多谢各位,原来then里面也要反回一个promise。。。。感觉好麻烦啊。。。。
F
引用 bombworm或者
@bombworm 正解
J
引用 wdwwtzy多谢各位,原来then里面也要反回一个promise。。。。感觉好麻烦啊。。。。
@wdwwtzy 我也觉得promise麻烦,要是一般处理回调层级不多的还是用callback,如果有多层回调采取promise更直观
参与回复
登录后即可参与回复。登录