【发布时间】:2021-10-31 06:39:29
【问题描述】:
我是 Node.js 的新手,我希望同时运行一些函数。
我看过几篇文章,据我了解,我可以使用Promise.all 和Promise.allSettled。
我不明白为什么我的函数顺序运行,这是我安排的代码。
async processPropositions(proposition) {
const dataWords = [];
const start = Date.now()
//async functions that return promises
const invariableData = this.invariables(propositionSplitted);
const nounsData = this.nouns(propositionSplitted);
const adjectivesData = this.adjectives(propositionSplitted);
const verbsData = this.verbs(propositionSplitted);
//here the code should stop until every promise is resolved
const [invariables, nouns, adjectives, verbs] = await Promise.all([invariableData, nounsData, adjectivesData, verbsData]);
//I find this time == to the sum of the time printed in the single functions abo
const finish = Date.now()
const time = finish - start
console.log(time)
//here in the original function I append results to dataWords
return dataWords;
}
我打印了单个异步函数(即this.invariables(propositionSplitted);、this.nouns(propositionSplitted);、this.adjectives(propositionSplitted);、this.verbs(propositionSplitted);)的时间,它们的总和等于我正在使用此函数打印的time。
当我尝试使用 for 循环为数组 propositions 的每个 proposition 运行主函数时,我遇到了同样的问题。由于它们是独立的,我想同时运行它们,然后在每个承诺得到解决时收集结果。
我试过了,但显然我错过了异步编码的基本概念:
for (let proposition of propositions) {
results.push(this.processPropositions(proposition));
for (let result of results) {
dataWords.push(await result);
if (propositions.length > 1 && results.indexOf(result) < conjunctions.length) dataWords.push(Conjunctions.getConjunction(conjunctions[results.indexOf(result)]));
}
}
如果我不await,for 循环会在它收到前提之前完成,而如果我保持await,它就会变成同步的。
【问题讨论】:
-
因此,您所寻求的时间检查需要在您获得所有承诺之后进行。现在,您可以在 Promise 完成之前执行该时间检查。它们不会阻止执行,但利用承诺的解决方案将为您提供真正花费的时间。
-
我想我没听懂你说的,但是我在整个过程结束时有另一个时间检查(第二个sn-p的功能),它太高了(几毫秒与
processProposition()中的check不同:代码是同步执行的。 -
this.processPropositions在做什么?它甚至做任何异步的事情吗? -
@Bergi 谢谢。
processPropositions只是调用不同的较小的独立函数并从中收集结果。由于它们是独立的,我希望它们同时运行,以提高性能。在链接中,我可以读到“在单独的子进程中运行它,并在完成后获得异步通知。”,我认为这实际上是在processProposition中发生的事情:正如你在我的第一段代码中看到的那样我正在调用使用async关键字声明的几个函数,所以它们应该是异步的,不是吗?
标签: node.js for-loop asynchronous async-await promise