如何根据mmjObject的数量循环执行Promise.coroutine,替代重复调用addCategories?
嘿,这个问题我太懂了!要根据mmjObject里的次数自动执行你的Promise.coroutine生成器函数,不用手动写三次调用,其实有几种简洁又实用的做法,我给你一步步拆解:
方法1:在生成器内部嵌入循环(最直接)
把循环逻辑直接放到Promise.coroutine包裹的生成器函数里,让它自动根据mmjObject的次数重复执行addCategories,这是最直观的方案:
// 假设你的mmjObject里存储次数的属性是count,比如 mmjObject.count = 3 const runBatchTasks = Promise.coroutine(function*() { const totalExecutions = mmjObject.count; // 从对象中获取需要执行的次数 for (let i = 0; i < totalExecutions; i++) { console.log(`正在执行第 ${i + 1} 次任务`); yield addCategories(); // 每次循环yield异步操作,等待完成后再执行下一次 } }); // 只需要调用一次,内部会自动跑完指定次数 runBatchTasks() .then(() => console.log('所有任务都执行完成啦!')) .catch(err => console.error('任务执行出错:', err));
这个方案的优势是逻辑高度集中,而且是顺序执行的——上一次addCategories执行完成后,才会启动下一次,非常适合任务之间有依赖的场景。
方法2:生成任务列表,灵活控制执行顺序
如果你需要更灵活的执行策略(比如并行执行所有任务),可以先把要执行的任务整理成列表,再用生成器处理:
顺序执行(和方法1效果一致)
const runSequentialTasks = Promise.coroutine(function*() { // 根据次数生成任务函数列表 const taskList = Array.from({ length: mmjObject.count }, () => addCategories); // 逐个执行任务 for (const task of taskList) { yield task(); } }); runSequentialTasks().then(/* 处理完成逻辑 */);
并行执行(适合无依赖的任务)
如果你的addCategories调用之间没有依赖关系,想同时启动所有任务来提高效率,可以用Promise.all配合yield:
const runParallelTasks = Promise.coroutine(function*() { // 直接生成所有任务的Promise实例 const taskPromises = Array.from({ length: mmjObject.count }, () => addCategories()); // 等待所有并行任务完成,拿到所有结果 const allResults = yield Promise.all(taskPromises); console.log('所有并行任务的结果:', allResults); }); runParallelTasks().then(/* 处理完成逻辑 */);
额外小技巧:如果需要传递参数
要是每次执行addCategories需要不同的参数(比如当前是第几次的索引),直接在循环里传就行:
// 比如把循环索引作为参数传给addCategories yield addCategories(i);
内容的提问来源于stack exchange,提问作者Rohan Singh
相关产品推荐
相关产品推荐

