[英]Javascript - Call function in parallel and return combined result
这是我的第一个问题,我正在尝试学习javascript / nodejs
我有一个数组x
。
var x = [1,2,3,4];
我还有一个函数,它接受一个参数,做一些处理并返回一个json。
function funcName (param){
//does some external API calls and returns a JSON
return result;
}
现在我正在寻找的不是迭代数组并一次又一次地调用函数,有没有办法并行调用它们然后加入结果并将它们一起返回?
此外,我正在寻找方法来捕获失败的函数执行。 for ex: funcName(3) fails for some reason
你可以做的是创建一个文件来完成繁重的工作,然后运行该文件的分支 。
在此功能中,我们执行以下操作:
cp.send()
将数据发送到fork 所以我们的主要流程看起来像这样:
const { fork } = require('child_process')
let x = [1,2,3,4]
function process(x) {
let promises = []
for (let i = 0; i < x.length; i++) {
promises.push(new Promise(resolve => {
let cp = fork('my_process.js', [i])
cp.on('message', data => {
cp.kill()
resolve(data)
})
}))
}
Promise.all(promises).then(data => {
console.log(data)
})
}
process(x)
现在,在我们的孩子中,我们可以听取消息,并完成繁重的工作,并将结果返回原样(非常简单的例子):
// We got some data lets process it
result = []
switch (process.argv[1]) {
case 1:
result = [1, 1, 1, 1, 1, 1]
break
case 2:
result = [2, 2, 2, 2, 2, 2]
break
}
// Send the result back to the main process
process.send(result)
评论和其他答案都是正确的。 JavaScript没有任何并行处理能力(分叉过程不计算在内)。
但是,您可以以模糊的方式进行API调用。 因为它们是异步的,所以网络IO可以交错。
考虑以下:
const urls = ['api/items/1', 'api/items/2', etc];
Promise.all(urls.map(fetch))
.then(results => {
processResults(results);
});
虽然这不会并行执行JavaScript指令,但异步提取调用不会等待彼此完成,而是交错,并且在完成所有操作后将收集结果。
有错误处理:
const urls = ['api/items/1', 'api/items/2', etc];
Promise.all(urls.map(fetch).map(promise => promise.catch(() => undefined))
.then(results => results.filter(result => result !== undefined))
.then(results => {
processResults(results);
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.