async

作者: Time_Notes | 来源:发表于2020-07-28 15:24 被阅读0次

async/await特点

async/await更加语义化,async是“异步”的简写,async function 用于申明一个function是异步的; await,可以认为是async wait的简写, 用于等待一个异步方法执行完成;

async/await是一个用同步思维解决异步问题的方案(等结果出来之后,代码才会继续往下执行)

可以通过多层async function的同步写法代替传统的callback嵌套

async/await

The async keyword before a function has two effects:

1.Makes it always return a promise.

2.Allows to use await in it.

If the caller does not make use of await(respectively then with promises) then your code will not run asynchronously


async关键字

1)表明程序里可能有异步过程

async表明程序里可能有异步过程(有await关键字);全部是同步代码也没关系,但async就显得多余了;

2)非阻塞

async函数里如果有异步过程会等待,但async函数本身会马上返回,不会阻塞当前线程。可以简单认为async函数工作在主线程,同步执行,不会阻塞界面渲染;async函数内部由await修饰的异步过程,工作在相应的协程上,会阻塞等待异步任务的完成再返回;

3)async函数返回类型为Promise对象

async函数会返回一个promise,并且Promise对象的状态值是resolved(成功的)

如果没有在async函数中写return,那么Promise对象resolve的值就是是undefined

如果写了return,那么return的值就会作为成功的时候传入的值

这是和普通函数本质上不同的地方,也是使用时重点注意的地方:

(1)return new Promise();这个符合async函数本意;

(2)return data;这是同步函数的写法,特别注意这其实就相当于Promise.resolve(data);还是一个Promise对象;但在调用async函数的地方通过简单的=是拿不到这个data的,因为返回值是一个Promise对象,所以需要用.then(data => { })才可以拿到data

(3)如果没有返回值,相当于返回了Promise.resolve(undefined);

example:

asyn function(){

    return await 1

返回值:resove(1)

4)无等待

在没有await的情况下执行async函数,它会立即执行,返回一个Promise对象,并且不会阻塞后面的语句,这和普通返回Promise对象的函数并无二致;

5)内部的await不处理异步error

await是不管异步过程的reject(error)消息的,async函数返回的这个Promise对象的catch函数负责统一抓取内部所有异步过程的错误;async函数内部只要有一个异步过程发生错误,整个执行过程就中断,这个返回的Promise对象的catch就能抓取到这个错误;


使用async和await获取成功的结果

function 摇色子(){

    return new Promise((resolve,reject)=>{

        let sino=parseInt(Math.random()*6+1)

        setTimeout(()=>{resolve(sino)},3000)

    })

}

async function test(){

    let n=await 摇色子()

    console.log(n)

}

test()

上面这段代码async中使await 摇色子()先执行,等到三秒后执行完再把得到的结果赋值给左边的n,也就是说test函数需要三秒钟才执行完成,所以test函数是异步的,因此前面必须写async


获取失败的结果: 把await和成功后的操作放到try里,失败的放在catch

function 摇色子(猜测){

    return new Promise((resolve,reject)=>{

        let sino=parseInt(Math.random()*6+1)

        if(sino>3){

            if(猜测==='大') resolve(sino)

            else reject(sino)

        }else{

            if(猜测==='大') reject(sino)

            else resolve(sino)

        }

        setTimeout(()=>{resolve(sino)},300)

    })

}

async function test(){

    try{

        //把await及获取它的值的操作放在try里

        let n=await 摇色子('大')

        console.log('赢了'+n)

    }catch(error){

        //失败的操作放在catch里

        console.log('输了'+error)

    }

}

test()


有多个promise,怎么拿到所有的promise都结束后的结果

比如有两个色子,想得到这两个色子的点数?

1.使用promise.all

function 摇色子(猜测){

    return new Promise((resolve,reject)=>{

        let sino=parseInt(Math.random()*6+1)

        if(sino>3){

            if(猜测==='大') resolve(sino)

            else reject(sino)

        }else{

            if(猜测==='大') reject(sino)

            else resolve(sino)

        }

        setTimeout(()=>{resolve(sino)},300)

    })

}

Promise.all([摇色子('大'),摇色子('大')])

.then(

    (x)=>{console.log(x)},

    (y)=>{console.log(y)}

)

promise.all里面跟一个数组,数组的每一项是一个返回promise的函数调用;

then的第一个参数是所有的promise都调用成功后,拿到所有promise的结果,是一个数组;第二个参数拿到的是第一个失败的值。

2.使用await

await是直接获取多个promise的结果的,因为Promise.all()返回的也是一个promise所以如果要使用await拿到多个promise的值,可以直接await Promise.all()

async function test(){

    try{

        let n=await Promise.all([摇色子('大'),摇色子('大')])

        console.log(n)

    }catch(error){

        console.log(error)

    }

}

test()


async实现原理(spawn函数)

async和await源码

相关文章

网友评论

      本文标题:async

      本文链接:https://www.haomeiwen.com/subject/jvmriqtx.html