【发布时间】:2022-10-09 01:01:22
【问题描述】:
我有一个任务列表,只有在为每个任务解决了所有依赖项之后,才需要执行所有这些任务。我正在努力寻找一种在最佳时间完成所有任务的方法。
// Each node is a async job, illustrated by setTimeout.
// A and C can run at the same time.
// D, needs to wait for A and C to be done.
// E needs to wait for A and D to be done.
function runTasks(tasks) {
// run tasks
}
// Sample of tasks
var tasks = {
'a': {
job: function (finish) {
setTimeout(function () {
console.log('a done');
finish();
}, 500);
},
},
'c': {
job: function (finish) {
setTimeout(function () {
console.log('c done');
finish();
}, 200);
},
dependencies: [],
},
'd': {
job: function (finish) {
setTimeout(function () {
console.log('d done');
finish();
}, 100);
},
dependencies: ['a','c'],
},
'e': {
job: function (finish) {
setTimeout(function () {
console.log('e done');
finish();
}, 200);
},
dependencies: ['a', 'd'],
},
};
【问题讨论】:
-
“A、B、C 可以同时运行。”他们是这样?请分享如何,因为 afaik JavaScript 是单线程的,一次只能运行一件事。 - 另外,你已经标记了承诺,但它们没有被使用。
-
为每个任务设置一个布尔值。让依赖于其他任务的任务按间隔而不是超时运行,并检查布尔值是否设置为 true。所以说 boolA = false。当任务 A 完成时,它将 boolA 设置为 true。函数 C 检查 boolA 和 boolB 是否都设置为 true。如果没有,它就不会运行并继续其间隔循环。如果是,它会运行并在之后取消自己的间隔,因此它不会再次运行。继续这样
-
上面的代码 sn-p 只是一个示例 sn-p,可以修改它以使用异步编程(async/await)
-
@evolutionxbox 好吧,是的,也不是。虽然 JS 是单线程的,但它确实有回调函数。这意味着它只是启动它们并继续运行其他任务,直到回调函数“回调它”。就像超时是一个回调函数一样,它只会运行其他任务,直到超时用完并回调它。如果其他任务需要在超时完成后运行,这可能是个问题。所以你,不是“同时”运行,但绝对是异步的
-
@icecub 使用 setInterval 将不满足“最佳时间”的要求,因为间隔会导致延迟。
标签: javascript asynchronous async-await promise