使用Async.Parallel Node.js同时搜索多个阵列

时间:2015-11-06 17:11:31

标签: javascript arrays node.js iteration async.js

我试图搜索可变数量的数组,当在任何数组中找到给定值时返回true。

我想知道如何解决这个问题,因为数组可能会非常大。 (我成功使用了Array.prototype.forEach,但因为它正在阻止'我想使用异步版本)

以下是我当前尝试的抽象。

 var desired_value = 'example'   
 (function(callback) {

     async.each(arry1, function(somevalue, callback) {
       if(somevalue === desired_value) return callback(null, true);
     });

     async.each(arry2, function(somevalue, callback) {
      if(somevalue === desired_value) return callback(null, true);
     });

     async.each(arry3, function(somevalue, callback) {
      if(somevalue === desired_value) return callback(null, true);
     });

 })(function(err, result) {
     return (!result || err) doThis() : doThat();
 });

1 个答案:

答案 0 :(得分:0)

阅读有关异步并行的说明:

  

注意:parallel是关于并行启动I / O任务,而不是关于   并行执行代码。如果您的任务不使用任何计时器或   执行任何I / O,它们实际上将被串行执行。任何   每个任务的同步设置部分将在一个之后发生   其他。 JavaScript仍然是单线程的。

https://github.com/caolan/async#paralleltasks-callback

编辑:至于错误,parallel需要执行一系列函数。但是,您使用的结果async.each并不会返回任何内容。

编辑:让其他人了解如何以非阻塞方式执行非IO代码:

function nonblockEach(arr, fn, iterations) {
  if (iterations == undefined) iterations = 1000;
  var count = 0;
  return function(callback) {
    var index = 0;
    function exec() {
      while (count < iterations && index < arr.length) {
        var element = arr[index];
        fn(element, index, arr);
        index++;
        count++;
      }
      if (index < arr.length) process.nextTick(exec);
      else callback();
    }
    process.nextTick(exec);
  }
}
var desired_value = 'example'   
var found = false;
async.parallel([
  nonblockEach(arry1, function(some_value) {
    found = found || (some_value === desired_value);
  }),
  nonblockEach(arry2, function(some_value) {
    found = found || (some_value === desired_value);
  }),
  nonblockEach(arry3, function(some_value) {
    found = found || (some_value === desired_value);
  })
], function(err) {
  return (found) ? something() : anotherThing();
});

未经测试,但它为您提供了想法。