Promise基本使用及链式
-
语法糖
-
ES6的语法:注意是JS的核心语法,不是node运行环境所有,也是和 {} []一样,前后端都是可以使用的!
-
Promise是什么:构造函数;直译【承诺】
-
意义:解决回调黑洞的问题,以更为合适的方式写异步代码,目标是更加容易维护代码;
- 写还是异步代码;
- 形式:发生改变,看起来更加舒服!更加好维护!
-
1.对异步的代码进行包装,设置【承诺】
// 实例化一个Promise; // 1.函数作为参数, // 2.而该函数又有两个形参, let p = new Promise((resolve, reject) => { // 形参resolve,单词意思是 完成 // 形参reject ,单词意思是 失败 fs.readFile('./a.txt', 'utf-8', (err, data) => { if (err) { // 失败,就告诉别人,承诺失败了 reject(err); } else { // 成功,就告诉别人,承诺实现了 resolve(data.length); } }); });
-
调用:兑现
// 通过调用 p 的then方法,可以获取到上述 “承诺” 的结果 p.then(res => { console.log(res) }) .catch(err => { console.log(err) })
-
前一个then里面返回的Promise对象,并且调用resolve的时候传递了数据,数据会被下一个then接收到
const fs = require('fs'); // 1. 定义一个承诺 let a_read = new Promise((resolve, reject) => { fs.readFile('./a.txt', 'utf-8', (err, data) => { if (err) { reject(err); } else { resolve(data.length); } }); }); let b_read = new Promise((resolve, reject) => { fs.readFile('./b.txt', 'utf-8', (err, data) => { if (err) { reject(err); } else { resolve(data.length); } }); }); let c_read = new Promise((resolve, reject) => { fs.readFile('./c.txt', 'utf-8', (err, data) => { if (err) { reject(err); } else { resolve(data.length); } }); }); // 2.调用 a_read .then((data) => { console.log(data); // a的数据 return b_read; }) .then((data) => { console.log(data); // b的数据 return c_read; }) .((data) => { console.log(data); // c的数据 });
优化封装
function read(path) {
return new Promise((resolve, reject) => {
fs.readFile(path, 'utf-8', (err, data) => {
err ? reject(err) : resolve(data.length);
})
});
}
//-----------------------------------------形式1
let a_read = read('./a.txt')
let b_read = read('./b.txt')
let c_read = read('./c.txt')
// 2.调用
a_read
.then((data) => {
console.log(data); // a的数据
return b_read;
})
.then((data) => {
console.log(data); // b的数据
return c_read;
})
.((data) => {
console.log(data); // c的数据
});
//-----------------------------------------形式2
read('./a.txt')
.then((data) => {
console.log(data); // a的数据
return read('./b.txt');
})
.then((data) => {
console.log(data); // b的数据
return read('./c.txt');
})
.((data) => {
console.log(data); // c的数据
});