这是我的第一个问题,我正在尝试学习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
答案 0 :(得分:1)
您可以做的是创建一个繁重的文件,然后运行该文件的fork。
在此功能中,我们执行以下操作:
cp.send()
所以我们的主要过程看起来像这样:
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)
答案 1 :(得分:0)
评论和其他答案正确。 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);
});