一个 nodeJS 脚本。我有一个功能:
async myFunc1(a, b, c) {
//.......
}
返回一些值但不返回
Promise
。我曾经这样运行它:
let a1 = await myFunc1(1, "fds", 99);
现在我需要同时运行几十个,并且它们的数量和参数的输入来自用户。
let lines = readDataFromUserProvidedFile();
for (let i = 0; i < lines; i++) {
//
//how to run all the myFunc1(...) in parallel??
//and then print out a result of each?
//(?)
myFunc1(lines[i], i, i*2);
}
我将如何以这种方式并行运行它们?当后续一个返回结果时,我想立即打印它。
对于函数,返回值大约需要 10 分钟。它不进行计算,它等待来自远程网络服务的结果。
您可以创建一个将并行执行的承诺集合,然后在该集合上迭代等待:
伪代码:
let lines = readDataFromUserProvidedFile();
const promises = lines.map((line, index) => myFunc1(line, index, index * 2));
// await the resolution of all promises and print the results as they become available
for await (const result of promises) {
console.log(result);
}
所以,promise 有两部分。处决他们,等待他们。等待它们意味着您正在附加回调以在获得结果时执行某些操作。执行它们意味着只是“踢掉它们”
你的问题是你正在使用
await
。启动异步过程和等待异步过程的结果是不同的。
tl;dr 你仍然可以使用
async/await
,只需立即使用 .map
: 开始所有的承诺
const myFuncToBeCalled = async () => {
let lines = readDataFromUserProvidedFile();
const promises = Array.from({length:lines}).map(async (_,i) => {
try {
const result = await myFunc1(lines[i], i, i*2);
console.log(`got result for line ${i}`,result)
return result
} catch(err) {
console.log(`got an error for line ${i}`, err)
}
})
const arrayOfResults = await Promise.all(promises)
return arrayOfResults
}