自制await处理异步任务函数

48 阅读1分钟
/**
* @description 处理传入的异步任务的函数,配合await使用
* @param {Function} asyncTask 异步任务函数,会接收一个实参(异步任务完成通知器)
* @return {Object} 返回一个包含then方法对象
*/
function handleAwaitAsyncFn(asyncTask) {
    const asyncFulfilled = Symbol('asyncFulfilled');

    const that = {
        [asyncFulfilled](value) {
            that._thenCallback(value);            
        },
        then(thenCallback) {            
            that._thenCallback = thenCallback;
        }
    }

    asyncTask(that[asyncFulfilled]);

    return that;
}

async function fn () {
    const p = await handleAwaitAsyncFn((asyncFulfilled) => {
        setTimeout(() => {
            asyncFulfilled('异步完成通知');
            console.log('里面-setTimeout-resolve');
        }, 1000)
    })
    
    console.log('外面 - p:', p);
}

fn();

// 调用fn()函数后得到打印顺序:
// 里面-setTimeout-resolve
// 外面 - p: 异步完成通知