promise可以解决回调函数带来的问题
1、解决回调地狱
案例场景:在文档a.txt中存放正文档b.txt的路径,在文档b.txt中存放正文档c.txt的路径, 我们要取出文档c.txt里面的内容。
回调函数实现:
/* a.txt -> b.txt -> c.txt -> 输出内容*/
let fs = require('fs');
let readFiles = ()=>{
// 回调1
fs.readFile('./a.txt','utf8',
(err,data)=>{
if(err)
return console.log(err);
// 回调2
fs.readFile(data,'utf8',
(err,data)=>{
if(err)
return console.log(err);
// 回调3
fs.readFile(data,'utf8',
(err,data)=>{
if(err)
return console.log(err);
console.log(data);
})
})
})
};
/*
调用输出结果:
喜欢IT, 就上撩课(itlike.com)
*/
readFiles();
通过promise解决回调地狱:
let fs = require('fs');
// 1. 初始化promise
let readFiles =(filePath)=>{
return new Promise(
(resolve,reject)=>{
fs.readFile(filePath,'utf8',
(err,data)=>{
if(err) return reject(err);
resolve(data);
})
})
};
// 2. 类似于链式的调用方式
readFiles('./a.txt')
.then((data)=>{
return readFile(data);
}).then((data)=>{
// 获取b.txt中内容
return readFile(data);
}).then((data)=>{
// 输出c.txt中内容
console.log(data)
}).catch((err)=>{
console.log(err)
});
2、同一时刻同步所有异步产生的结果
该场景在实际开发中有很多应用场景,比如:我们要提交一个操作时,需要结合之前的两个异步请求的结果才能进行。
再比如:你要进行下一个运算时,需要前面两个异步运算的结果才能进行。我们还是通过读取文件的案例来进行举例。
常规方式实现:
let fs = require('fs');
// 1. 统一输出所有异步产生的结果
let allContent = {};
let logAllContent =
(key,data)=>{
allContent[key] = data;
if(Object.keys(allContent).length
=== 2){
console.log(allContent)
}
};
// 2. 分别异步读取文件中的内容
fs.readFile('./a.txt', 'utf8',
(err, data) =>{
if (err) return console.log(err);
logAllContent(data);
});
fs.readFile('./b.txt', 'utf8',
(err, data) =>{
if (err) return console.log(err);
logAllContent(data);
});
这样的方式虽然解决了问题,但是你不知道最终结果是在哪个异步函数中输出,而且你需要在所有的异步函数中都去调用打印方法
promise方式大大简化:
借助promise.all()方法,不管哪个promise谁先完成,该方法会按照数组里面的顺序将结果返回。
let fs = require('fs');
let readFiles = (filePath)=>{
return new Promise(
(resolve,reject)=>{
fs.readFile(filePath,'utf8',
(err,data)=>{
if(err) return reject(err);
resolve(data);
})
})
};
Promise.all(
[readFiles('./a.txt'),
readFiles('./b.txt')]
).then(([data])=>{
console.log({data})
});
网友评论