async/await

Koa中大量使用了异步组合语法async/await, 提供了一种使得异步代码看起来像同步代码的替代方法

Promise

async/await
pending可以转化为fulfilled或rejected并且只能转化一次,也就是说如果pending转化到fulfilled状态,那么就不能再转化到rejected。并且fulfilled和rejected状态只能由pending转化而来,两者之间不能互相转换

  • 除了串行执行若干异步任务外,Promise还可以并行执行异步任务
  • Promise.all接受一个promise对象的数组,待全部完成之后,统一执行success
  • Promise.race接受一个包含多个promise对象的数组,只要有一个完成,就执行success

Code

先在chrome里执行下面这段代码

function getSyncTime() {
    return new Promise((resolve,reject)=>{
        try{
            let startTime = new Date().getTime()
            setTimeout(()=>{
                let endTime = new Date().getTime()
                let data = endTime - startTime
                resolve(data)
            },500)
        }catch(err){
            reject(err)
        }
    })
}

async function getSyncData(){
    // 解析异步promise
    let time = await getSyncTime()
    let data = `endTime - startTime = ${time}`
    return data
}

async function getData(){
    let data = await getSyncData()
    console.log(data)
}

getData()
console.log('test....')

console输出效果

test....
Promise {<pending>}
endTime - startTime = 502

async/await

当函数执行的时候,一旦遇到 await 就会先返回,等到触发的异步操作完成,再接着执行函数体内后面的语句

  • async/await是基于Promise实现的,它不能用于普通的回调函数
  • async/await与Promise一样,是非阻塞,使用await,函数必须用async标识
  • await后面通常跟的是一个Promise实例,或异步函数,最底层的 await 返回需要是 Promise对象
  • 可以通过多层 async function 的同步写法代替传统的callback 嵌套

other

node事件循环,显然是在当前轮事件线程上下文执行完自动调用异步任务
golang则是若主goroutime无阻塞退出后,则其它异步goroutine则无机会进行执行。
与nodejs中的async/await是用promise的语法糖一样,python中async/await 也是对生成器yield的简化处理

本作品采用《CC 协议》,转载必须注明作者和本文链接
pardon110
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!