You need to enable JavaScript to run this app. JavaScript 嵌套 callback 函数仅部分执行,如何让后续函数正常运行
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript 嵌套 callback 函数仅部分执行,如何让后续函数正常运行

问题根因

  • 现有所有log函数的设计仅接收数值参数,没有处理传入的回调函数逻辑,你在sequenceLogs中嵌套传入的回调函数根本不会被执行,自然只有第一个logFirst可以正常运行
  • logSecond、logFourth中使用了setTimeout异步逻辑,直接return变量的话,定时器回调还未执行,返回的变量永远是undefined,异步操作的结果不能靠return返回,必须通过回调函数传递

调整方案

所有log函数新增回调参数,计算得到下一个执行序号后,调用回调将序号传递给下一个执行函数:

// 所有log函数新增第二个参数callback,计算完成后调用回调传递下一个序号
function logFirst(number, callback) {
    console.log(`Runs ${number}rst`);
    const nextNumber = number - 1;
    callback && callback(nextNumber);
}
function logSecond(number, callback) {
    console.log(`Runs ${number}nd`);
    // 异步操作结束后再调用回调传递结果
    setTimeout(() => {
        const nextNumber = number - 1;
        callback && callback(nextNumber);
    }, 75);
}
function logThird(number, callback) {
    console.log(`Runs ${number}rd`);
    const nextNumber = number - 1;
    callback && callback(nextNumber);
}
function logFourth(number, callback) {
    console.log(`Runs ${number}th`);
    setTimeout(() => {
        const nextNumber = number - 1;
        callback && callback(nextNumber);
    }, 50);
}
function logFifth(number, callback) {
    console.log(`Runs ${number}th`);
    const nextNumber = number - 1;
    callback && callback(nextNumber);   
}

const sequenceLogs = (initialNumber) => {
    // 按执行顺序嵌套调用,前一个函数完成后自动触发下一个函数执行
    logFirst(initialNumber, (nextNumber) => {
        logSecond(nextNumber, (nextNumber) => {
            logThird(nextNumber, (nextNumber) => {
                logFourth(nextNumber, (nextNumber) => {
                    logFifth(nextNumber);
                });
            });
        });
    });
};

sequenceLogs(5);

运行输出

Runs 5rst
Runs 4nd
Runs 3rd
Runs 2th
Runs 1th

内容的提问来源于stack exchange,提问作者tlockhart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 14:06:02