Promise对象
ECMAScript 6新增了Promise 对象,该对象允许对延迟和异步操作流程进行控制。一个 Promise对象就是一个代表了异步操作最终完成或者失败的对象。
开发人员可以使用由其他函数创建并返回的Promise对象。Promise对象本质上就是一个绑定了回调的对象,而不是将回调传进函数内部。
一个Promise有以下几种状态:
- pending:初始状态,既不是成功,也不是失败状态。
- fulfilled:意味着操作成功完成。
rejected:意味着操作失败。
创建Promise对象
ECMAScript 6新增了Promise 对象是一个构造函数,用于创建生成Promise 对象实例。
let promise = new Promise(function (resolve, reject) {
});
executor表示带有resolve和reject两个参数的函数。
- Promise 构造函数执行时立即调用executor函数,resolve和reject两个函数作为参数传递给executor ( executor函数在Promise构造函数返回新建对象前被调用)。
- resolve和reject函数被调用时,分别将Promise的状态改为fulfilled(完成)或rejected(失败)。意味着操作失败。
let promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("测试成功啦...");
}, 2000);
});
//将Promise 状态改变 - 要么成功,要么失败
promise.then((value) => {
console.log(value);
});
Promise对象由其他函数创建并返回;
function fn() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("测试成功啦...");
}, 2000);
});
}
var promise = fn();
Promise对象的约定
在应用Promise时,将会有以下约定:
- 在JavaScript事件队列的当前运行完成之前,回调函数永远不会被调用。
- 通过.then形式添加的回调函数,甚至都在异步操作完成之后才被添加的函数,都会被调用。
- 通过多次调用.then,可以添加多个回调函数,它们会按照插入顺序并且独立运行。
因此,Promise最直接的好处就是链式调用
Promise对象的链式操作
常见的需求就是连续执行两个或者多个异步操作。这种情况下,每一个后来的操作都在前面的操作执行成功之后,带着上一步操作所返回的结果开始执行。可以通过创造一个Promise来完成这种需求。then()函数会返回一个新的Promise,跟原来的不同:
//创建 Promise对象
let promise = new Promise((resolve