如何使一系列任务中的项目等待其他任务完成?



我有一长串对象,其中包含:

1) 进程名称("名称") 2) 函数("任务") 3) 该函数的参数("参数")

某些任务依赖于其他任务的完成,然后才能执行。我希望它们动态等待任何依赖项的完成。

我希望做的是有一个异步函数,为依赖于其他部分的函数提供名称参数。这样,函数将被搁置,直到任务可以执行。我需要它是动态的,没有 2 或 3 个列表单独执行。可能存在取决于其他依赖任务的任务。

任务列表:

let tasks = [
{name: 'numerator', task: insert, arguments: ['part', 'UK', '2010']},
{name: 'divide', task: calculate, arguments: ['UK', '2010', await waitFor('numerator'), await waitFor('denominator')]},
{name: 'denominator', task: insert, arguments: ['whole', 'UK', '2010']}
];

循环:

tasks.forEach(d => {
d.task(d.arguments);
}

功能:

async function waitFor(taskName) {
await tasks.find(d => d.name === taskName).task;
return taskName;
}
async function insert(mode, country, year) {
//Connect to database, sum up raw data and insert
}
async function divide(country, year, upper, lower) {
//Connect to database, retrieve the values, divide one by the other and insert
}

现在,我非常清楚上述解决方案不起作用。我看到两个问题: 1) waitFor 函数在初始化之前引用任务数组 2)承诺没有像我希望的那样奏效。依赖任务的执行不会神奇地延迟,直到其他任务完成。

有人可能会说,这是一种愚蠢的做事方式。我继承了代码,其中有固定的顺序并等待每个任务,这非常耗时。我希望创建一个可以添加任务并自动协调一切的系统。所以问题是:

应该如何编写 waitFor 函数以及如何在任务数组中使用它才能正常工作?

非常感谢对此的帮助。

我只是从waitFor返回一个承诺,然后在相关任务完成后解决它。评估任务首先等待其所有参数:

const byName = {};
let tasks = [
{name: 'numerator', task: insert, arguments: ['part', 'UK', '2010']},
{name: 'divide', task: calculate, arguments: ['UK', '2010', waitFor('numerator'), waitFor('denominator')]},
{name: 'denominator', task: insert, arguments: ['whole', 'UK', '2010']}
];

function waitFor(name) {
if(byName[name]) {
return byName[name].done;
} else {
const task = byName[name] = { name };
return task.done = new Promise(resolve => task.resolve =  resolve);         
}
}
function runTask({ name, task, arguments }) {
waitFor(name); // cause promise to be set up, dont await!
byName[name].resolve(
Promise.all(arguments)
.then(args => task(...args))
);
}
tasks.forEach(runTask);

确保永远不会有循环依赖关系,这将导致死锁。

我想你正在寻找

const numeratorPromise = insert('part', 'UK', '2010');
const denominatorPromise = insert('whole', 'UK', '2010');
const dividePromise = Promise.all(['UK', '2010', numeratorPromise, demoniatorPromise])
.then(args => calculate(...args));
// await dividePromise - or whatever you want to do with the result

您可以以这种方式构建任意多个承诺,对以前创建的承诺具有任意依赖关系,并且它们将尽可能并发运行。Promise.all可确保满足依赖项。然后等待单一的最终结果承诺。

相关内容

最新更新