背景:
在JavaScript的世界中,所有代码都是单线程执行的。由于这个“缺陷”,导致JavaScript的所有网络操作,浏览器事件,都必须是异步执行。异步执行可以用回调函数实现.
div.onclick = function(){}
Promise使ES6中引入的一个异步编程解决方案,与传统的ES5方法相比它的结构更合理,功能更强大.
特点:
Promise
对象代表一个异步操作,有三种状态:pedding
(进行中)、fulfilled
(已成功)和rejected
(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态.语法 原型方法:var p = new Promise(function(resolve,reject){})
resolve 代表 决定 (成功); reject 代表(失败) 静态方法:promise.xxx()
基本使用:const p = new Promise(function(resolve,reject){
setTimeout(function(){
// resolve('我是成功的')
reject('这是失败的');
},2000)
});
注意:
.then(callback)的使用(成功时调用)
.catch(callback的用法(失败时调用)
finally() 当前 Promise 转变状态以后, 不管成功还是失败都会执行
p.then(function(data){
console.log('resolved成功回调');
console.log('成功回调接受的值:',data);
}).catch(function(reason, data){
console.log('catch到rejected失败回调');
console.log('catch失败执行回调抛出失败原因:',reason);
});
resolve作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
promise静态方法
1. all()
=> 把多个 Promise 重新包装成一个新的 Promise
=> 只有所有状态都是 fulfilled 该包装后的 Promise 才会成功
2. any()
=> 把多个 Promise 重新包装成一个新的 Promise
=> 只要有一个状态都是 fulfilled 该包装后的 Promise 就是成功
3. race()
=> 把多个 Promise 重新包装成一个新的 Promise
=> 拿到最先执行完毕的那个 promise 对象的结果, 其余的不管了
4. allSettled()
=> 把多个 Promise 重新包装成一个新的 Promise
=> 返回的最终结果是一个数组, 包含每一个 promise 对象的状态
总结:
Promise 承诺
+ 一个承诺有多少种状态
=> 持续
=> 成功
=> 失败
+ 一个承诺有多少种变化
=> 持续 -> 成功
=> 持续 -> 失败
其实promise还有很多用处,比如 promise 的封装,promise 的链式调用,对于promise的相关用法可以在评论区分享。加油加油!!!!