Async和await

异步操作是 JavaScript 编程的麻烦事,麻烦到一直有人提出各种各样的方案,试图解决这个问题。从最早的回调函数,到 Promise 对象,再到 Generator 函数,每次都有所改进,但又让人觉得不彻底。它们都有额外的复杂性,都需要理解抽象的底层运行机制。异步I/O不就是读取一个文件吗,干嘛要搞得这么复杂?异步编程的最高境界,就是根本不用关心它是不是异步。async 函数就是隧道尽头的亮光,很多人认为它是异步操作的终极解决方案。--阮老师的博客

基本规则

  • async 表示这是一个async函数,await只能用在这个函数里面。

  • await 表示在这里等待promise返回结果了,再继续执行。

  • await 后面跟着的应该是一个promise对象(当然,其他返回值也没关系,只是会立即执行,不过那样就没有意义了…)

function waitAMinute(time) {
return new Promise(resolve=>{
setTimeout(()=>{
resolve(20)
}, time)
})

async function test() {
console.log('hello world')
console.log(await waitAMinute(2000)) //两秒钟后输出20
console.log('welcome')
}

test(); //hello world , 20, welcome

获取返回结果

  • await等待的虽然是promise对象,但不必写.then(..),直接可以得到返回值,会直接获取resolve的执行结果

let start = function() {
return new Promise(resolve=>{
setTimeout(()=>{
resolve('HelloWorld')
})
})
}

let end = async function() {
let result = await start()
console.log(result) //获取结果HelloWorld
}
end()

异常处理

既然then不必写了,那么.catch()也不需要写了,直接将await代码放入try/catch异常处理块儿当中

let end = async function() {
try {
let result = await start()
console.log(result)
} catch(error) {
throw new Error(err.message)
}
}

注意

  1. ***await 关键字只能用在async function内部,否则会报错
  2. ***这里所说的一步函数内部表示必须在改异步函数的执行上下文中才可以

[...].forEach(function(value,index){
console.log('当前是第'+ index +'次调用')
var result = await start() //报错
})

posted @ 2017-06-10 11:28  飘零的日子  阅读(199)  评论(0编辑  收藏  举报