async函数
- await只能在async函数中使用
- async函数执行后返回一个promise对象
- async函数执行时,遇到await会先返回一个promise对象,等到async函数中所有的逻辑执行完,这个promise对象状态才会发生变化
- async函数是generator函数语法糖
async await的使用
function fn(nums) {
return new Promise(resolve => {
setTimeout(() => {
resolve(nums * 2)
}, 1000)
})
}
async function gen(value = 1) {
const num1 = await fn(value)
const num2 = await fn(num1)
const num3 = await fn(num2)
return num3
}
gen(2).then(res => {
console.log(res)
})
通过generator函数结合promise实现async await功能
function fn(nums) {
return new Promise(resolve => {
setTimeout(() => {
resolve(nums * 2)
}, 1000)
})
}
function* gen(value = 1) {
const num1 = yield fn(value)
const num2 = yield fn(num1)
const num3 = yield fn(num2)
return num3
}
function generatorToAsync(generator) {
return function () {
const gen = generator.apply(this, arguments)
return new Promise((resolve, reject) => {
function go(key, arg) {
let next = null
try {
next = gen[key](arg)
} catch (error) {
return reject(error)
}
const { value, done } = next;
if (done) {
return resolve(value)
}
Promise.resolve(next.value).then(val => go("next", val), err => go("throw", err))
}
go("next")
})
}
}
const myAsyncFn = generatorToAsync(gen)
myAsyncFn(2).then(res => {
console.log(res)
})