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

K6中default函数是否会等待异步方法执行完成?

K6中setTimeout对default函数生命周期及VU迭代的影响

核心结论

你的初步猜测部分正确:default函数会在调用setTimeout后立刻结束,但当前VU(虚拟用户)不会提前进入下一次迭代,会等待所有异步操作(包括setTimeout的回调)完成后,才会启动下一轮迭代。

详细解释

  1. default函数的结束时机
    当代码执行到setTimeout语句并完成回调注册后,default函数会继续执行后续代码(如果有的话),直到函数体完全结束——完全不会等待400ms后的回调触发。比如在函数末尾添加日志,会看到这行日志先于回调内的日志输出。

  2. VU迭代的等待逻辑
    K6的实验性异步API(包括setTimeout)会被当前VU的执行周期跟踪。即便default函数已经结束,VU也会停留在当前迭代,直到所有未完成的异步任务执行完毕,才会开始下一次迭代。这意味着第二个HTTP请求一定会在当前迭代内完成,不会被丢到下一轮。

  3. 和sleep的关键区别

    • sleep(1)是阻塞式等待:default函数会停在sleep语句处,直到1秒后才继续执行,函数结束时间就是等待完成的时间。
    • setTimeout是非阻塞式:default函数提前结束,但VU会等待回调执行,最终迭代的总时长约为patch请求耗时 + 400ms + post请求耗时,和使用sleep(0.4)的总时长接近,但执行逻辑不同。

验证代码示例

你可以通过添加日志直观看到执行顺序:

export default () => {
  http.patch(firstURL, body, params);
  setTimeout(() => {
    const res = http.post(secondURL, body, params);
    console.log('POST请求完成,状态码:', res.status);
  }, 400); // 建议传入数字400而非字符串,符合API规范
  console.log('default函数已执行完毕');
};

执行时的日志顺序为:

  1. default函数已执行完毕(default函数结束)
  2. 等待400ms
  3. POST请求完成,状态码: xxx(回调执行完成)
  4. 当前VU进入下一次迭代(如果配置了多次迭代)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:05:17