es6,es7中的同步异步的使用

同步,异步?

js是同步阻塞单线程运行的,so?需要等待,然后就出现了很多异步的操作需要同步等待执行,比如请求数据是异步的(这个是都会遇到的),这个时候就需要我们异步转同步。

Promise

将异步的操作转换成同步,解决了回调地狱的问题,看起来更优雅

三种状态:

reject:  拒绝,后面的将不会执行

resove: 成功,会执行后面的,可以传参  参数会传入下一个链式调用的方法里面

pendding:加载中,还未完成

直接根据例子来分析吧:

let p = new Promise(function (resolve, reject1) {
   setTimeout(function () {
       console.log('111');
       resolve('传过去的数据data');
   },1000)
}).then(function (data) {
    console.log('2222');
    console.log('传过来的数据',data);
    return Promise.reject();
}).then(function () {
    console.log('333');
}).catch(function (e) {
    console.log('error', e);
});

上面代码一个简单的promise实例,会在1s后打印111,然后打印2222,然后并不会打印333,第一个then接受的参数是由上面创过来的,第一个then里面使用Promise.reject()来中断后续的操作,这就是then的链式调用。

 

async/await

async/await是es7的新标准,它是基于Promise语法糖的,因为await后面接的函数调用必须是返回了Promise对象的函数。不过相对于Promise更简单,只需要在将函数用async修饰,然后函数内部使用await(即等待的意思)。

上例子看效果吧:

async function test() {
    //await的返回必须是Promise对象才能由作用
    await t1();
    console.log('t1结束');
    await t2();
    console.log('t2结束');
    t3();
    t4();
}
async function t1() {

    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            console.log('t1');
            resolve();
        }, 1000);
    })
}

function t2() {
    return new Promise(function (resolve,reject) {
        setTimeout(function () {
            console.log('t2');
            resolve();
        }, 1000);
    })

}

function t3() {

    setTimeout(function () {
        console.log('t3');
    }, 1000)
}
function t4() {
    setTimeout(function () {
        console.log('t4');
    }, 1000)
}

test();

效果:

上面例子的t3就没有返回Promise对象  就不会等待  直接t4就跟着出来啦

总结:

还是async/await用起来舒服点,可读性也要高点,其次Promise,再次的话就回调吧,如果是老项目考虑兼容性的话还写规范点吧,尽量少些一些回调,用回调的话有时候代码多或者事件久连自己不知道在哪里调用的啦。      不过现在 好多都是直接用框架啦,就可以用Promise和async/await了! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值