Promise小记

异步编程

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值