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

时间:2018-07-27 01:55:12

标签: javascript node.js ecmascript-6

这是我的第一个问题,我正在尝试学习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

2 个答案:

答案 0 :(得分:1)

您可以做的是创建一个繁重的文件,然后运行该文件的fork

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

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

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

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);
});