promise是什么?
它是一个对象,有三种状态:
pending: 初始状态,不是成功或失败状态。
pfulfilled: 意味着操作成功完成。
rejected: 意味着操作失败。
有什么作用?
- 主要用于异步计算
- 可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果
- 可以在对象之间传递和操作promise,帮助我们处理队列
优缺点
优点:
- 异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。
- Promise 对象提供统一的接口,使得控制异步操作更加容易。
缺点:
- 无法取消 Promise,一旦新建它就会立即执行,无法中途取消
- 如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部
- 当处于 Pending 状态时,无法得知目前进展到哪一个阶段
promise的创建
const promise = new Promise(function(resolve, reject) {
//写异步操作代码
//结果使用resolve,reject处理
}).then(function(result) {
//接受resolve调用的值
}).catch(function(err) {
//接受reject调用的值
})
实例
const promise = new Promise(function(resolve, reject) {
//写异步操作代码
//结果使用resolve,reject处理
setTimeout(function() {
resolve('resolve');
}, 1000);
}).then(function(result) {
//接受resolve调用的值
console.log(result);//打印resolve
}).catch(function(err) {
//接受reject调用的值
console.log(err);
})
注意:如果同时写了resolve和reject,谁先写的,就会执行谁,不会执行完之后再去执行另一个,promise状态只能改变一次。
promise常见面试题
console.log(1);
const promise = new Promise(function(resolve, reject) {
console.log(2);
setTimeout(function() {
console.log(4);
}, 1000);
resolve(3);
console.log(5);
}).then(function(result) {
console.log(result);
})
console.log(6);
//打印125634
解析:按照从上倒下优先执行顺序,首先打印的是1,2,5,6;js中先运行主线程的程序,再运行事件队列中的程序;promise和定时器都属于事件队列,其中,在js中promise是微队列,定时器是宏队列,微队列要比宏队列优先执行,所以其次打印的是3,4。最后打印的结果是:1、2、5、6、3、4
promise简单写法
async function promise() {
return await 1;
}
promise().then(function(resolve) {
console.log(resolve);
}).catch(function(err) {
console.log(err);
})
async相当于是new Promise对象,await相当于是resolve或者reject,这个比较简单,但是有一点需要注意的是,它的状态不可控,你不知道promise现在的状态是什么,可能是pfulfilled状态,也可能是rejected状态,所以你需要同时监听两种状态
promise方法
Promise.all方法
var p = Promise.all([p1,p2,p3]);
Promise.all 方法接受一个数组作为参数,p1、p2、p3 都是 Promise 对象的实例。(Promise.all 方法的参数不一定是数组,但是必须具有 iterator 接口,且返回的每个成员都是 Promise 实例。)
p 的状态由 p1、p2、p3 决定,只有状态都是fulfilled,p的状态才是fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数;否则p状态就是rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
Promise.race 方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。
var p = Promise.race([p1,p2,p3]);
该方法是只要有一个实例状态先改变,p的状态就改变,先改变的实例返回值就会传递给p的返回值