一、概述
Promise是ES6引入的异步编程的新解决方案。语法上Promise是一个构造函数,用来封装异步操作并可以获取其成功或失败的结果。
解读:
(1)当在setTimeout中使用resolve()方法的时候,会调用p.then方法中的第一个回调函数;
(2) 当在setTimeout中使用reject()方法的时候,会调用p.then方法中的第二个回调函数;
二、应用实例
1、使用Promise封装读取.md后缀的文件
2、使用Promise封装Ajax请求
3、Promise.prototype.then()方法
(1)返回值为一个Promise对象
以上代码的输出结果为:
4、 Promise实现多个文件的读取
// 引入 Node.js 的 fs 模块
const fs = require("fs");
// 利用Promise实现多个文件的读取
const p = new Promise((resolve, reject) => {
fs.readFile("./sources/鹅鹅鹅.md", (err, data) => {
resolve(data);
});
});
// 指定回调
p.then((value) => {
return new Promise((resolve, reject) => {
fs.readFile("./sources/悯农.md", (err, data) => {
resolve([value, data]);
});
});
})
.then((value) => {
return new Promise((resolve, reject) => {
fs.readFile("./sources/小池.md", (err, data) => {
value.push(data);
resolve(value);
});
});
})
.then((value) => {
console.log(value.join("\r\n"));
});
好处:可以避免回调地狱,与以下普通实现进行对比:
// 引入 Node.js 的 fs 模块
const fs = require("fs");
// 普通实现 -- 回调地狱
fs.readFile("./sources/鹅鹅鹅.md", (err, data1) => {
fs.readFile("./sources/悯农.md", (err, data2) => {
fs.readFile("./sources/小池.md", (err, data3) => {
let result = data1 + "\r\n" + data2 + "\r\n" + data3;
console.log(result);
});
});
});
结果:
5、Promise.prototype.catch()方法
用来指定Promise对象失败的回调
const p = new Promise((resolve, reject) => {
setTimeout(() => {
// 设置 p 对象的状态为失败,并设置失败的值
reject("出错啦!");
}, 1000);
});
p.catch(function (reason) {
console.warn(reason);
});
结果:
其实catch方法就是一个语法糖,是then方法省略了对Promise对象成功的回调。以下为用then方法实现对失败的回调,代码如下:
const p = new Promise((resolve, reject) => {
setTimeout(() => {
// 设置 p 对象的状态为失败,并设置失败的值
reject("出错啦!");
}, 1000);
});
p.then(function(value){},function(reason){
console.error(reason);
})
结果: