CNode

我这个promise写的哪里不对吗?

问答
Wwdwwtzy发布于10 年前最后回复10 年前11 回复4360 浏览0 收藏
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
oyosc#1·10 年前

你的问题是那里没有return,因为Promise是链式的,所以每一个then里面都要return一下,你那个return在fs里的回调函数里面,当然不行了,异步读取什么时候完成不可控,你想获取两个的话可以用promise.all就好了

O
oyosc#3·10 年前
引用 wdwwtzy@oyosc 多谢,不过加了return也不行,我打断点,发现console.log先于return data+value执行的……

@wdwwtzy 没注意到,你直接 fs.readFile('2.txt', 'utf-8', (err, data) => { console.log(data+value); });

这样就可以了呀...

W
wdwwtzy#4·10 年前
O
oyosc#5·10 年前

好吧,你要继续往后面then的话就需要在file2那再写个promise,建议你直接Promise.all,这样方便多了

B
bombworm#6·10 年前
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(""));
});
M
manxisuo#7·10 年前

then需要返回一个Promise或者数据。 From Noder

T
TimothyJin#8·10 年前

then和then里面的异步理解的偏差。。。

W
wdwwtzy#9·10 年前

多谢各位,原来then里面也要反回一个promise。。。。感觉好麻烦啊。。。。

F
flamingtop#10·10 年前
引用 bombworm或者

@bombworm 正解

J
jiangliqin#11·10 年前
引用 wdwwtzy多谢各位,原来then里面也要反回一个promise。。。。感觉好麻烦啊。。。。

@wdwwtzy 我也觉得promise麻烦,要是一般处理回调层级不多的还是用callback,如果有多层回调采取promise更直观

参与回复
登录后即可参与回复。登录