You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让第二个函数等待第一个函数执行完成?语法求助

让第二个函数等待第一个函数执行完成的解决方案

首先看你的两个函数:rr里的DOM修改和数组操作都是同步执行的——这类代码会从上到下依次完成,不会出现“还没做完就跳去执行下一个函数”的情况。所以如果只是单纯想让reset在rr执行完毕后运行,直接按顺序调用就可以:

// 先执行rr的全部操作,完成后再运行reset
rr();
reset();

但如果你之后打算给rr加入异步操作(比如定时器、API请求、DOM动画这类需要等待的任务),那就要用异步处理的语法了,下面是几种常见的方案:

方案1:使用回调函数

给rr添加一个回调参数,在rr的所有操作(包括异步操作)完成后调用这个回调:

// 修改rr,加入回调参数
function rr(callback) {
  gr1.innerText = niz.splice(niz[Math.floor(Math.random()*niz.length)],1)
  gr2.innerText = niz.splice(niz[Math.floor(Math.random()*niz.length)],1)
  dl1.innerText = niz.splice(niz[Math.floor(Math.random()*niz.length)],1)
  dl2.innerText = niz.splice(niz[Math.floor(Math.random()*niz.length)],1)
  
  // 如果之后加了异步操作(比如定时器),要把回调放在异步逻辑的内部
  // setTimeout(() => { callback(); }, 1000);
  
  // 当前同步场景下,直接调用回调
  callback();
}

// 调用时把reset作为回调传进去
rr(reset);

方案2:使用Promise和async/await(更现代的写法)

把rr改成返回Promise的函数,再用async/await语法来等待它执行完成:

// 把rr改为返回Promise的函数
function rr() {
  return new Promise((resolve) => {
    gr1.innerText = niz.splice(niz[Math.floor(Math.random()*niz.length)],1)
    gr2.innerText = niz.splice(niz[Math.floor(Math.random()*niz.length)],1)
    dl1.innerText = niz.splice(niz[Math.floor(Math.random()*niz.length)],1)
    dl2.innerText = niz.splice(niz[Math.floor(Math.random()*niz.length)],1)
    
    // 如果有异步操作,把resolve放在异步逻辑的回调里
    // setTimeout(() => { resolve(); }, 1000);
    
    // 同步场景下直接标记任务完成
    resolve();
  });
}

// 用async函数包裹调用逻辑
async function runTasks() {
  await rr(); // 等待rr的所有操作完成
  reset(); // 再执行reset
}

// 启动任务
runTasks();

补充说明

如果你的rr函数一直都是同步操作,那直接顺序调用的方式就完全够用——同步代码本身就是按顺序执行的,前一个函数的所有语句执行完毕后,才会执行下一个函数的代码。只有当函数里包含异步操作时,才需要用到回调、Promise这类异步处理语法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 00:02:55