手撕Async/Await函数

237 阅读1分钟
//封装延迟函数
function delay(wait) {
    return new Promise((resolve, reject) => {
        setTimeout(function () {
            resolve(wait)
        }, wait)
    })
}

//generator函数
function* fun() {
    var x1 = yield delay(1000)
    console.log(x1)
    var x2 = yield delay(4000)
    console.log(x2)
}

//调用实现
var itor = fun()
itor.next().value.then(result => {
    itor.next(result).value.then(result => {
        itor.next(result)
    })
})

//封装async/await函数
function asyncFunction(generator) {
    var itor = generator()
    var next = (x) => {
        const { value, done } = itor.next(x)
        if (done) return
        value.then(result => {
            next(result)
        })
    }
    next()
}
//函数调用
asyncFunction(function* fun() {
    var x1 = yield delay(1000)
    console.log(x1)
    var x2 = yield delay(4000)
    console.log(x2)
})