你可以使用async.lua来管理回调函数, 避免在callback hell里沉沦, 减少心智负担.
You can use async.lua to manage your callback functions, avoid sinking in callback hell, and reduce mental burden.
瀑布流执行 - 按顺序执行任务,每个任务的结果会传递给下一个任务。
参数:
tasks(array): 函数数组,每个函数接收(callback, ...)参数callback(function): 最终回调函数function(err, result)
示例:
async.waterfall({ function (callback) callback(nil, 1, 2) end, function (callback, a, b) print(a, b) -- 输出: 1, 2 callback(nil, 3) end, function(callback, a) print(a) -- 输出: 3 callback(nil, 4) end }, function (err, result) if err then print('error:', err) else print(result) -- 输出: 4 end end)
并行执行任务,可选择性地限制最大并行数量。
参数:
max_parallel_num(number, 可选): 最大并行数量,默认为 5tasks(array): 函数数组,每个函数接收(callback)参数callback(function): 最终回调函数function(err, results)
返回值:
results是一个数组,每个元素是对应任务的返回值数组
示例 1 - 默认并行数:
async.parallel({ function (callback) callback(nil, 'task1') end, function (callback) callback(nil, 'task2') end, function (callback) callback(nil, 'task3') end }, function (err, results) if err then print('error:', err) else -- results = {{'task1'}, {'task2'}, {'task3'}} for i, result in ipairs(results) do print(result[1]) end end end)
示例 2 - 指定最大并行数:
-- 最多同时执行 2 个任务 async.parallel(2, { function (callback) callback(nil, 'A') end, function (callback) callback(nil, 'B') end, function (callback) callback(nil, 'C') end, function (callback) callback(nil, 'D') end }, function (err, results) if err then print('error:', err) else print('all tasks completed') end end)
注意:
- 当任务数量超过
max_parallel_num时,任务会被分组,每组最多max_parallel_num个任务,各组按顺序执行 - 如果任何一个任务返回错误,整个操作会立即终止并调用最终回调
所有回调函数的第一个参数都是错误对象 err:
- 如果没有错误,
err应该为nil - 如果有错误,传递错误信息(通常是字符串)
-- 错误示例 async.waterfall({ function (callback) callback('something went wrong') end, function (callback) -- 这个函数不会被执行 callback(nil, 'result') end }, function (err, result) if err then print('error occurred:', err) -- 输出: error occurred: something went wrong end end)
lua test.lua