繁体   English   中英

Javascript - 并行调用函数并返回组合结果

[英]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

你可以做的是创建一个文件来完成繁重的工作,然后运行该文件的分支

在此功能中,我们执行以下操作:

  • 循环遍历数组中的每个值,并创建一个我们将存储在数组中的promise
  • 接下来我们创建一个fork
  • 然后我们使用cp.send()将数据发送到fork
  • 等待回复并解决承诺
  • 使用promise.all我们可以告诉我们所有子进程何时完成
  • 第一个参数是所有子进程结果的数组

所以我们的主要流程看起来像这样:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM