Last updated on

实现一个有依赖关系的 Promise all

// 模拟一个降级异步接口
const isDegrade = (isDegrade) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            reject(isDegrade)
        }, 1000)
    })
}

const requestA = async () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            resolve('requestA')
        }, 2000)
    })
}

const main = async () => {
    console.time('main')
    const degrade = await isDegrade(false)
    if (degrade) {
        return
    }
    const res = await requestA()
    console.log(res)
    console.timeEnd('main')
}


// 实现一个有依赖关系的 Promise all
const main2 = async () => {
    console.time('main2')
    const degradePromise = new Promise((resolve) => {
        isDegrade(true).then(resolve, () => resolve(false))
    })
    const requestAPromise = requestA()
    const res = await new Promise((resolve) => {
        degradePromise.then((res) => {
            // 如果要降级
            if (res) {
                resolve(null)
            }
        })
        requestAPromise.then(async (res) => {
            await degradePromise
            resolve(res)
        })
    })
    if (!res) {
        return
    }
    console.log(res)
    console.timeEnd('main2')
}

// main()
// main2()


const buildMainInvokeWithDegrade = (degradePromise: Promise<any>, requestAPromise: Promise<any>) => {
    const finalDegradePromise = new Promise((resolve) => {
        degradePromise.then(resolve, () => resolve(false))
    })
    return new Promise((resolve) => {
        finalDegradePromise.then((res) => {
            // 如果要降级
            if (res) {
                resolve(null)
            }
        })
        requestAPromise.then(async (res) => {
            await finalDegradePromise
            resolve(res)
        })
    })
}

const main3 = async () => {
    console.time('main3')
    const res = await buildMainInvokeWithDegrade(isDegrade(true), requestA())
    console.log(res)
    console.timeEnd('main3')
}

main3()