一:Promise 的概念
Promise 的中文意思是‘承诺’,什么叫承诺?承诺就是现在没有发生,在将来的某个时刻一定会发生的事情。
放在编程语言的环境下,Promise 就是异步事件的结果的占位符。我们不用去管异步事件的结果什么时候来,只需要关心异步事件的结果产生的时候,你想要做什么就对了。
二:Promise 的生命周期
异步事件不是立即执行程序,它的结果可能要在动作发生后一段时间才到,所以它有个生命周期。例如用电饭锅煮米饭,从【米下锅开始定时】到【定时结束】,这是煮米饭的生命周期。
一个 Promise 的生命周期主要有 2 个阶段:
1: unsettled(pending)处理过程中 -> 米饭定时开始到定时结束这段期间
2: settled (fulfilled 或者 rejected) 处理完 -> 米饭定时结束状态
我们看到 settled 阶段会出现两个可能的状态 fulfilled 或者 rejected,它们分别是什么意思呢:
1: fulfilled Promise 操作完成的结果为成功 -> 煮米饭水的比例合适,饭熟了,成功
2: rejected Promise 操作完成的结果为失败 -> 煮米饭水放少了,饭是夹生的,失败
Promise 内部的属性 PromiseState 被用来表示 Promise 的 3 种状态:pending,fulfilled 和 rejected
。但是我们无法读取到这三个状态,而是通过 Promise 提供的接口方法来书写对应的处理程序,后面会讲到。
三:如何让创建一个 Promise
相信前面通过对比煮饭这个过程,你已经对 Promise 的概念和生命周期有了一定的体会,接下来我们就看看如何真正第创建一个 Promise(如何煮米饭)。
声明:因为 Promise 有 未完成的 Promise
和 已完成的 Promise
不同类型,本篇我们只讨论 未完成的 Promise
。已完成的 Promise
后面会讲,目前来说你不必关心,就当世界上没有这个东西。
通过 Promise 构造函数,可以创建一个 Promise。构造函数只有一个参数:一个函数,我们叫它执行器(executor)函数。你可以理解为煮饭用的电饭煲。
既然执行器(executor)函数也是一个函数,那它也有参数。对,它有 2 个参数:
1: resolve() Promise 执行成功时的处理函数
2: reject() Promise 执行失败时的处理函数
我们用一段代码来解释一下:
let executor = function (resolve, reject) {};
let promise = new Promise(executor);
通过上面的代码示例,应该就能很清楚创建一个 Promise 的语法解构是怎样的了。接下来我们用一个在 Node.js 中读取文件的例子来演示:
let executor = function (resolve, reject) {let fs = require('fs');
fs.readFile('data.txt', {encoding: 'utf8'}, function (error, content) {if (error) {reject(error); // 在异步行为成功时,调用 reject()方法
return;
}
resolve(content); // 在异步行为失败时,调用 resolve()方法});
};
let promise = new Promise(executor);
解释一下上面的代码:
1: fs.readFile()本身是一个异步行为,其方法的第三个参数为一个回调函数。读取文件的结
果通过此回调函数传入(失败时候的 error 和成功时候的 content)。
2: 我们在 fs.readFile()的回调函数里,在文件读取成功时调用 resolve()方法,失败的时候调用 reject()方法,把成功或者失败的结果通过 2 个函数的参数传入,为 Promise 在 fulfilled 或者 rejected 两种状态时提供数据。
四:编写 Promise 结果处理程序