1 基本概念
- 名称:
译为“承诺”,这也就表达了将来会执行的操作,代表异步操作;
- 状态:
一共有三种状态,分别为pending(进行中)、fulfilled(已成功)和rejected(已失败)。
- 特点:
(1)只有异步操作可以决定当前处于的状态,并且任何其他操作无法改变这个状态;
(2)一旦状态改变,就不会在变。状态改变的过程只可能是:从pending变为fulfilled和从pending变为rejected。如果状态发生上述变化后,此时状态就不会在改变了,这时就称为resolved(已定型)
2 基本用法
Promise 对象是由关键字 new 及其构造函数来创建的。
首先,
介绍一下如何创建一个 Promise;
const promise = new Promise((resolve, reject) => {
// do something here ...
if (success) {
resolve(value); // fulfilled
} else {
reject(error); // rejected
}
});
由上述代码我们可知: 该构造函数接收两个函数作为参数,分别是resolve和reject。
当异步操作执行成功后,会将异步操作结果作为参数传入resolve函数并执行,此时
Promise对象状态从pending变为fulfilled; 失败则会将异步操作的错误作为参数传入reject函数并执行,此时
Promise对象状态从pending变为rejected;
接下来,
我们通过then方法,分别指定resolved状态和rejected状态的回调函数。
promise.then(function(value) {
// success
}, function(error) {
// failure
});
then方法可以接收两个回调函数作为参数,第一个回调函数就是fulfilled状态时调用;第二个回调函数就是rejected时调用。这边的第二个参数是可选的,不一定要提供。
all()方法:
Promise 的 all 方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。
race()方法:
race 按字面解释,就是赛跑的意思。race 的用法与 all 一样,只不过 all 是等所有异步操作都执行完毕后才执行 then
回调。而 race 的话只要有一个异步操作执行完毕,就立刻执行 then 回调。注意:其它没有执行完毕的异步操作仍然会继续执行,而不是停止。
then()方法
then 方法就是把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数。
而 Promise 的优势就在于这个链式调用。我们可以在 then 方法中继续写 Promise 对象并返回,然后继续调用 then
来进行回调操作。
reject()方法:
上面样例我们通过 resolve 方法把 Promise 的状态置为完成态(Resolved),这时 then
方法就能捕捉到变化,并执行“成功”情况的回调。 而 reject 方法就是把 Promise 的状态置为已失败(Rejected),这时
then 方法执行“失败”情况的回调(then 方法的第二参数)
普通函数中的this指向函数被调用的对象,因此对于不同的调用者,this的值是不同的。而箭头函数中并没有自己的this(同时,箭头函数中也没有其他的局部变量,如this,argument,super等),所以箭头函数中的this是固定的,它指向定义该函数时所在的对象。