async.retry函数使用求助:为何仅执行一次(预期出错重试3次)
问题分析与修复方案
核心错误点
- 任务函数绑定逻辑错误:你通过
bind给callFunc提前传入了自定义callback,导致async.retry无法注入它需要的重试控制回调。async.retry要求任务函数的最后一个参数必须由它提供,用来判断是否触发重试。 - 回调参数顺序(次要):虽然你传递错误对象的逻辑没问题,但async标准回调格式是
callback(err, result),你写的callback(errorObj, null)可以简化为callback(errorObj),因为第二个参数在失败场景下可忽略。
修正后的代码
var async = require('async'); function callFunc(data, time, name, callback) { console.log("#"); // 传入错误对象,触发重试逻辑 callback({ message: data, time, name }); // 模拟成功时改为:callback(null, { message: "ok" }); } // 仅绑定固定参数,留最后一个callback位置给async.retry注入 var func = callFunc.bind(null, "data", "time", "name"); async.retry({ times: 3, interval: 1000 }, func, function (err, results) { console.log('==================================='); console.log('最终错误:', err); console.log('Async function 执行完成'); });
修正说明
- 绑定
callFunc时只传入前三个固定参数,不自定义callback,让async.retry在每次调用时自动传入控制重试的回调函数。 - 当
callFunc的callback传入非null错误时,async.retry会按照配置的times(3次)和interval(1秒)执行重试,控制台会打印3个#。 - 最终回调会接收最后一次重试的错误对象,若某次调用成功(callback第一个参数为null),则直接返回结果并终止重试。
内容的提问来源于stack exchange,提问作者Froggy
相关产品推荐
相关产品推荐

