async/await
Koa中大量使用了异步组合语法
async/await
, 提供了一种使得异步代码看起来像同步代码的替代方法
Promise
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 协议》,转载必须注明作者和本文链接