定义
async function 用来定义一个返回AsyncFunction对象的异步函数。异步函数是
指通过实践循环异步执行的函数,他会通过一个隐式的Promise返回其结果
var asyFn = async function(){
}
console.log(asyFn())//Promise {<resolved>: undefined}
语法
async function name([param[,param[,....param]]]){statements}
参数
name——函数名称
param——要传递给函数的参数
statements——函数体语句
var asyncFn1 = async function(){
console.log("1111")
return "dddd"
// return new Error("err")
}
asyncFn1().then(function(res){
console.log(res)
})
返回值
返回Promise对象会运行执行(resolve)异步函数的返回结果,或者运行拒绝(reject)——如果异步函数抛出异常的话
描述
异步函数可以包含await指令,该指令会暂停异步函数的执行,并等待Promise执行,然后继续执行异步函数,并返回结果,记住await关键字只在异步函数内有效。如果你在异步函数外使用它,
会抛出语法错误。注意,当异步函数暂停时,它调用的函数会继续执行(收到异步函数返回的隐式Promise)
async/await的目的是简化使用多个promise时的同步行为,并对一组Promises执行某些操作。正如Promises类似于结构化回调,async/await更像结合了generators和promise
var resolveAfter2Seconds = function(){
console.log("starting slow promise");
return new Promise(resolve => {
setTimeout(function(){
resolve("slow");
console.log("slow promise is done")
},2000)
})
}
var resolveAfter1Second =function(){
console.log("starting fast promise");
return new Promise(resolve => {
setTimeout(function(){
resolve("false");
console.log("fast promise is done")
},1000)
})
}
var sequentialStart = async function(){
console.log("===SEQUENTIAL START===");
const slow = await resolveAfter2Seconds();
const fast = await resolveAfter1Second();
console.log(fast)
}
var concurrentStart = async function(){
console.log("===CONCURRENT START with await===");
const slow = resolveAfter1Second();
const fast = resolveAfter1Second();
console.log(await slow);
console.log(await fast)
}
var concurrentPromise = function(){
console.log("===CONCURRENT START WITH Promise.all===")
return Promise.all([resolveAfter2Seconds(),resolveAfter1Second()]).then((message) => {
console.log(message[0])
console.log(message[1])
})
}
var parallel = async function(){
await Promise.all([
(async() => console.log(await resolveAfter2Seconds()))(),
(async() => console.log(await resolveAfter1Second()))()
])
}
var parallelPromise = function(){
console.log("===PARALLEL with Promise.then===");
resolveAfter2Seconds().then((message) => console.log(message));
resolveAfter1Second().then((message) => console.log(message))
}
sequentialStart();
setTimeout(concurrentStart,4000)
setTimeout(concurrentPromise,7000)
setTimeout(parallel,1000)
setTimeout(parallelPromise,13000)