我这个promise写的哪里不对吗?
发布于 8 年前 作者 wdwwtzy 3892 次浏览 来自 问答
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 回复

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

@oyosc 多谢,不过加了return也不行,我打断点,发现console.log先于return data+value执行的……

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

这样就可以了呀…

@oyosc 额 我是个举例,肯定是后续还有复杂的操作…

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

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(""));
});

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

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

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

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

回到顶部