K6中default函数是否会等待异步方法执行完成?
K6中setTimeout对default函数生命周期及VU迭代的影响
核心结论
你的初步猜测部分正确:default函数会在调用setTimeout后立刻结束,但当前VU(虚拟用户)不会提前进入下一次迭代,会等待所有异步操作(包括setTimeout的回调)完成后,才会启动下一轮迭代。
详细解释
default函数的结束时机
当代码执行到setTimeout语句并完成回调注册后,default函数会继续执行后续代码(如果有的话),直到函数体完全结束——完全不会等待400ms后的回调触发。比如在函数末尾添加日志,会看到这行日志先于回调内的日志输出。VU迭代的等待逻辑
K6的实验性异步API(包括setTimeout)会被当前VU的执行周期跟踪。即便default函数已经结束,VU也会停留在当前迭代,直到所有未完成的异步任务执行完毕,才会开始下一次迭代。这意味着第二个HTTP请求一定会在当前迭代内完成,不会被丢到下一轮。和
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函数已执行完毕'); };
执行时的日志顺序为:
default函数已执行完毕(default函数结束)- 等待400ms
POST请求完成,状态码: xxx(回调执行完成)- 当前VU进入下一次迭代(如果配置了多次迭代)
内容的提问来源于stack exchange,提问作者msmith1114
相关产品推荐
相关产品推荐

