Promise
知识
常用法:
let pro = new Promise((resolve,reject)=>{
...
resolve('OK');
...
//reject('not OK');
})
pro.then(()=>{ }),catch(()=>{ });
then
和catch
都会返回Promise
,他们因此可以被链式调用
其实等同于
pro.then( ()=>{ }, ()=>{ } );
then
最多可以跟两个参数,第一个其实是resolve
,第二个是reject
。
then
还可以被多次调用,可以前面返回return
后面跟着用
pro.then(val=>{
retrun val+1;
}).then(val=>{
console.log(val); //打出的值是 结果+1;
})
或者这样
Promise.resolve('OK').then(val=>{
val // val : OK
});
Promise
的标准有7个。
resolve
,reject
,all
,race
,finally
,done
,
但是后两个兼容性不好,没有被广泛支持,只有最新的chrome有这个。
finally
不论结果是resolve
,或者reject
都至都执行 类似$ajax的always
Promise.prototype.finally = function (callback){
let P = this.constructor;
return this.then(
value => P.resolve(callback()).then(() => value), //这个callback是加了(),直接执行 而不是传的是函数的参数
reason => P.resolve(callback()).then(() => { throw reason })
);
};
done
Promise
对象的回调链,不管以then
方法或catch
方法结尾,要是最后一个方法抛出错误,都有可能无法捕捉到(因为 Promise 内部的错误不会冒泡到全局)。因此,我们可以提供一个done方法,总是处于回调链的尾端,保证抛出任何可能出现的错误。(或者说done
是最后执行的Promise
链)
Promise.prototype.done = function (onFulfilled, onRejected) {
this.then(onFulfilled, onRejected)
.catch(function (reason) {// 抛出一个全局错误
setTimeout(() => { throw reason }, 0);
});
};
all
,race
可以传多个Promise
Promise.all([p1, p2]).then((result) => {
console.log(result) //['p1的返回', 'p2的返回']
}).catch((error) => {
console.log(error)
})
race
只then
,catch
返回最快返回的那个
async
和 await
知识
官方解释:
await 表达式会暂停当前 async function 的执行,等待 Promise 处理完成。若 Promise 正常处理(fulfilled),其回调的resolve函数参数作为 await 表达式的值,继续执行async function。若 Promise 处理异常(rejected),await 表达式会把 Promise 的异常原因抛出。另外,如果 await 操作符后的表达式的值不是一个 Promise,则返回该值本身。
这样更容易理解:
async 函数返回一个 Promise 对象,当函数执行的时候,一旦遇到 await 就会先返回,等到触发的异步操作完成,再接着执行函数体内后面的语句。
say = ()=>{
return new Promise((resolve, reject)=> {
setTimeout(()=> {
resolve(`test`);
},3000);
});
}
async function demo () {
const v = await say(); // 如果成功, 会把回调 resolve函数的参数作为结果
//只有resolve才有返回
console.log('hahahahah')
console.log(v);
}
demo();