gpt4 book ai didi

javascript - 使用 JS Promise 或 Generator 并行执行最多 N 个任务

转载 作者:行者123 更新时间:2023-12-03 04:38:53 25 4
gpt4 key购买 nike

我想实现一个 JS 类,它使用 JS Promise 或生成器并行执行最多 N 个任务。类似的东西

class Executor {
constructor(numberOfMaxTasks) {
...
}

next(task) {
...
}

done(onDone) {
...
}
}

....
const executor = new Executor(2);
executor.next(task1).next(task2).next(task3).done(onDone);

任务 1 和任务 2 应并行执行,而任务 3 应等到前面的任务之一完成。当所有任务完成时,将执行 onDone 回调。

我尝试使用 Promise 来实现它,但失败了。我是生成器的新手,目前不知道它们是否可以在这里提供帮助。这主要是为了学习目的,这就是为什么我不想使用任何第三方库,而只想使用原生 JS。任何提示都会很棒,提前致谢!

最佳答案

我认为你最好使用bluebird promise library .

例如,bluebird provides map function它可以做你想做的事:

  • 在第一个参数中,您可以指定任务执行所需的数据数组
  • 在第二个参数中,您可以指定映射器函数,该函数可以实际运行您的任务并返回 promise
  • 在第三个参数中,您可以使用 { concurrency: N } 对象指定“一次最多 N 个任务”。

请注意,对于 bluebird.map 函数,不保证执行顺序。唯一保证 bluebird.map 的结果将以相同顺序的结果数组实现 promise 。

使用该函数,您可以在没有 Executor 类的情况下重写代码(示例适用于 Node.js):

const Promise = require('bluebird')
const os = require('os')
const task1Data = 1000
const task2Data = 5000
const task3Data = 3000

const tasksData = [ task1Data, task2Data, task3Data ]
function taskExecutorMapper(taskData) {
// here is place for your code that actually runs
// asynchronous operation based on taskData and returns promise
// I'll use setTimeout here for emulate such operation
return new Promise(function(resolve) {
setTimeout(resolve, taskData)
}
}
const tasksPromise = Promise.map(
tasksData,
taskExecutionMapper,
{ concurrency: os.cpus().length })
.then(onDone)

希望这有帮助!

关于javascript - 使用 JS Promise 或 Generator 并行执行最多 N 个任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43170100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com