面试问题:你了解promise吗?
1. promise是一个对象,用来传递异步操作的消息。通过promise提供的统一的API,可以对异步操作的结果做进一步处理,使得控制异步操作更加容易。
2. promise的构造函数接收一个参数,这个参数是一个函数,并且传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数
- resolve函数的作用,当Promise对象的状态从从Pending(未完成)变为Resolved,在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
- reject函数的作用是,在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
3. Promise实例生成以后,可以用then方法分别制定Resolved状态和Rejected状态的回调函数:
- promise.then ( onFulfilled, onRejected )
- 接收两个函数作为参数,一个在 fulfilled 的时候被调用,一个在 rejected 的时候被调用,接收参数就是 future,onFulfilled对应 resolve, onRejected 对应 reject。
3. 当promise状态固定之后,就会调取 then()方法,进行处理,then 方法指定的回调函数返回的是另一个promise,所以就可以实现连续的 then方法的调用来代替回调嵌套,从而避免了回调地狱,提高了代码的可读性和可维护性。
基本用法:
var promise = new Promise(function(resolve,reject){
if(/* 异步操作成功 */)
{
resolve(value);
}else{
reject(error);
}
});
1. Promise的构造函数接收一个参数,这个参数是一个函数,并且传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数
resolve函数的作用,将Promise对象的状态从从Pending(未完成)变为Resolved,在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject函数的作用是,在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
2. Promise实例生成以后,可以用then方法分别制定Resolved状态和Rejected状态的回调函数:
- promise.then ( onFulfilled, onRejected )
- 接收两个函数作为参数,一个在 fulfilled 的时候被调用,一个在 rejected 的时候被调用,接收参数就是 future,onFulfilled对应 resolve, onRejected 对应 reject。
状态:
pending: 初始状态, 非 fulfilled 或 rejected.
fulfilled: 成功的操作.
rejected: 失败的操作.
settled: Promise已被fulfilled或rejected,且不是pending
另外, fulfilled 与 rejected 一起合称 settled。
Promise对象有以下2个特点:
1. 对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成)和Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。
2. 一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从Pending变为Resolved;从Pending变为Rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对Promise对象田静回调函数,也会立即得到这个结果。
基本的api
- Promise.resolve():
- 将现有对象转成promise对象
- Promise.reject():
- 同上,转成的promise对象状态为Rejected
- Promise.prototype.then():
- 为Promise实例添加状态改变时的回调函数
- Promise.prototype.catch():
- 用于指定发生错误时的回调函数
- Promise.all():
- 接收一个数组作为参数,数组内部都为promise实例,如果不是会先调用Promise。resolve方法将Promise转为Promise实例。当所有promise实例状态均为Fulfilled,Promise.all()的状态才会为Fullfilled
- Promise.race():
- 同Promise.all()将多个Promise实例包装成一个新的promise实例,但是只要其中一个实例状态改变Promise.race()的状态就会跟着改变
两个附加方法
- done()
- finally()