Promise
回调地狱
const fs = require('fs');
fs.readFile('./data/a.txt', 'utf8', (err, dataA) => {
if (err) {
throw err;
}
fs.readFile('./data/b.txt', 'utf8', (err, dataB) => {
if (err) {
throw err;
}
fs.readFile('./data/c.txt', 'utf8', (err, dataC) => {
if (err) {
throw err;
}
fs.readFile('./data/d.txt', 'utf8', (err, dataD) => {
if (err) {
throw err;
}
fs.writeFile('./data/e.txt', dataA + dataB + dataC + dataD, (err) => {
if (!err) {
console.log('success');
}
})
});
});
});
});
Promise概念
Promise是ES6中新增的一个构造函数。
-
目的
解决回调地狱的问题
一个容器,用来封装一个异步任务
-
三种状态
- Pending 异步任务正在执行
- Resolved 成功执行
- Rejected 执行失败
Promise基本使用
- 使用Promise封装一个异步任务
const fs = require('fs');
const p = new Promise(function (resolve, reject) {
fs.readFile('./data/a.txt', 'utf-8', (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
- 调用
p.then((data) => {
// 传递给容器的resolve函数
console.log(resove);
}, (err) => {
// 传递给容器的reject函数
console.log(err);
});
then和catch
then执行Promise中的resolve函数,catch执行Promise中的reject函数
const fs = require('fs');
const p1 = new Promise(function (resolve, reject) {
fs.readFile('./data/a.txt', 'utf-8', (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
const p2 = new Promise(function (resolve, reject) {
fs.readFile('./data/b.txt', 'utf-8', (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
const p3 = new Promise(function (resolve, reject) {
fs.readFile('./data/c.txt', 'utf-8', (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
p1
.then((d) => {
console.log(d);
return p2;
})
.then((d1) => {
console.log(d1);
return p3;
})
.then((d2) => {
console.log(d2);
});
Promise封装
const fs = require('fs');
function openFile(filePath) {
return new Promise(function (resolve, reject) {
fs.readFile(filePath, 'utf-8', (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
}
openFile('./data/a.txt')
.then((data) => {
console.log(data);
return openFile('./data/b.txt');
})
.then((data) => {
console.log(data);
})
async 函数
ES2017引入了 async 函数,目的是简化异步操作。
使用 async 的目的,是调用异步操作的时候,不需要写回调函数
async function fn() {
const a = await 1;
console.log(a);
}
fn();
await使用的时候必须在 async 函数中,await 后跟Promise对象才有意义
const fs = require('fs');
function openFile(filePath) {
return new Promise(function (resolve, reject) {
fs.readFile(filePath, 'utf-8', (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
}
async function main() {
const data = await openFile('./data/a.txt');
const data2 = await openFile('./data/b.txt');
console.log(data);
console.log(data2);
}
main();
如果 async 函数 有返回值的情况
- 如果返回Promise对象,直接返回
- 如果返回普通数据会转换成Promise对象
const fs = require('fs');
async function main() {
const a = 1;
return a;
// 相当于
// return new Promise(function (resolve, reject) {
// resolve(1);
// });
}
const result = main();
// console.log(result);
result.then((data) => {
console.log(data);
});