promise\then\async\await\setTimeout的执行顺序

79 阅读1分钟

执行顺序

  • 同步代码
  • promise 中的同步代码
  • then 微任务中代码
  • setTimeout 中的代码
async function executeTask(){
    console.log("1、任务开始执行")
    await toHandleOrderBet();
    console.log("13、任务结束执行")
}

async function toHandleOrderBet(){
    await _typeGoldPc();
    await _commitBetByRequest();
}

async function _typeGoldPc(){
    console.log("2、进入_typeGoldPc")
    await waitForElementAndAct().then((resolve)=>{
        console.log("5、我在这里等你完成", resolve);
    });
    console.log("6、执行完成_typeGoldPc");
}
async function _commitBetByRequest(){
    console.log("7、进入_commitBetByRequest");
    await waitForElementAndAct2(async () =>{
        await new Promise((resolve)=>{
            console.log("9、进入_commitBetByRequest定时器");
            setTimeout(()=>{console.log("17、中间的定时器====");resolve();},1000);
            console.log("10、设置了_commitBetByRequest定时器");
        })
    })
    console.log("12、执行完成_commitBetByRequest");
}
async function waitForElementAndAct(){
    console.log("3、进入第一个waitForElementAndAct");
    return new Promise((resolve)=>{
        const startTime = Date.now();
        const intervalId = setInterval(() => {
            if (Date.now() - startTime > 5000) {
                clearInterval(intervalId);
                setTimeout(() => {
                    console.log("16、任务执行:内部定时器", Date.now());
                }, 800);
                console.log("4、清理定时器111", Date.now());
                resolve(true);   
            }
        }, 300);
    });
}

async function waitForElementAndAct2(fn){
     console.log("8、进入第二个waitForElementAndAct2");
    return new Promise((resolve)=>{
        const startTime = Date.now();
        const intervalId = setInterval(() => {
            if (Date.now() - startTime > 5000) {
                clearInterval(intervalId);
                fn();
                console.log("11、222清理定时器22", Date.now());
                resolve();   
            }
        }, 300);
    });
}
async function main(){
    await executeTask().then(()=>{
        console.log("14、那我是什么吗");
    });
    console.log("15、executeTask任务执行完成");
}

main();