异步编程
Promise
Promise基础(后续补充)
status:pending rejected fulfiled 后续补充
resolve和reject后面的代码还是会执行。保险点还是加个return
https://www.jianshu.com/p/b4f0425b22a1
并行: Promise.all 和 Promise.race(后续增加例子代码)
Promise.all和Promise.race都可以将多个Promise实例包装成一个新的Promise实例。且多个实例是并行的。
区别在于,all的成功状态是需要所有实例都成功,且返回的是数组,顺序与all传入的实例顺序一一对应;只要有一个状态是rejected,则失败,且返回的是第一个状态转为rejected的实例的值。而race的状态由第一个完成的Promise实例决定,若第一个完成的状态是fulfiled,则状态由pending转为fulfiled;若第一个完成的状态是rejected,则状态pending转为rejected。
Async/Await
Async/Await基础(后续补充)
async修饰的函数返回Promise对象。await只能在async函数体内使用。
并行和串行
首先可以明确的是,由于async修饰的函数返回Promise对象,结合Promise.all可以实现并行。
另外还有一个并行的方式,可以和串行一起品品。此处参考https://www.jianshu.com/p/ed75c221982f 的例子,感谢作者卡夫。
串行:
(async ()=>{
// 抽象一个函数 等待相应的时候后返回成功状态,如果小于0为失败状态
let waitFun = function (time) {
return new Promise((resolve, reject)=>{
if(time>0){
setTimeout(()=>{
resolve(time)
},time)
}else {
reject('执行失败')
}
})
}
//-----------------------------------------------------------------------------------------------------------------------------
console.time()
let r1 =await waitFun(3000)
console.log('输出结果:',r1);
let r2 =await waitFun(2000)
console.log('输出结果:',r2);
let r3 =await waitFun(1000)
console.log('输出结果:',r3);
console.timeEnd()
/**
* 控制台输出:
* 输出结果: 3000
* 输出结果: 2000
* 输出结果: 1000
* default: 6002.86572265625ms
*/
})()
并行:
console.time('total time')
let fn1 = waitFun(3000);
let fn2 = waitFun(2000);
let fn3 = waitFun(1000);
let r1 = fn1;
console.log('输出结果:',await r1);
let r2 =fn2;
console.log('输出结果:',await r2);
let r3 =fn3;
console.log('输出结果:',await r3);
console.timeEnd('total time')
/**
* 输出结果: 3000
* fn1 time: 3009 ms
*
* 输出结果: 2000
* fn2 time: 3010 ms
*
* 输出结果: 1000
* fn3 time: 3011 ms
*
*
* total time: 3011 ms
*/
将后续异步函数的声明放在第一个await之前,由于new Promise是立即执行的。所以在第一个await之前就已经开启了异步操作的挂起,在等待异步数据的返回了。固第二个代码是并行的。而第一个代码中,在第一个await之后,即3000结束第一个异步已调用后才开始的第二个异步的挂起,所以是串行的。
来做做题吧 https://blog.csdn.net/lqyygyss/article/details/102662606