用法

例1 控制按顺序完成异步操作

var fetchData = function(id){
return new Promise((reslove,reject)=>{
    setTimeout(function(){
        console.log(`任务${id}执行`)
        reslove(`执行结果${id}`)
    },Math.random()*1000)
    })
}

async function tasksList(){
    //这里面的任务并发执行
    let list = [1,2,3,4,5]
    let promises = list.map((task)=>{
       return fetchData(task)
    })
    let results = await Promise.all(promises);
    return results
}

tasksList().then((res)=>{
    console.log(res)
    console.log("全部任务完成")
})
任务1执行
任务2执行
任务4执行
任务5执行
任务3执行
["执行结果1", "执行结果2", "执行结果3", "执行结果4", "执行结果5"]

可以看到很类似promise,结果的输出是按照list的顺序的,区别是promise在函数执行之前就已经在执行异步请求了。

例2 继发完成异步操作

//fetchData和例1相同
async function tasksList(){
    //这里面的任务继发执行
    let  results  = [];
    try{
        for(let i=0;i<5;i++){
            let result =  await fetchData(i)
            results.push(result)
        }
    }catch(e){
        console.log(e)
    }
    return results
}

tasksList().then((res)=>{
    console.log(res)
    console.log("全部任务完成")
})
任务0执行
任务1执行
任务2执行
任务3执行
["执行结果0", "执行结果1", "执行结果2", "执行结果3", "执行结果4"]
全部任务完成

概念

async是Generator函数的语法糖。 async相比于Gennerator改进的地方在于:

内置执行器

asycn不像Generator需要执行器(co模块)

更好的语义

async表示函数里有异步操作,await表示是紧跟在后面的表达式需要等待结果

更广的适用性

async函数的await命令后面,可以使Promise对象和原始类型的值,原始类型的值会返回一个立即resolved的promise对象

返回值是promise

可以用then方法指定下一步的操作