用法
例 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 方法指定下一步的操作