使用async.parallel处理数组

时间:2013-11-27 20:43:24

标签: node.js asynchronous

我需要处理两个单独的数组。由于它们不依赖于代码,我想异步地执行此操作。

这是我的代码:

cats = ['snowball', 'berlioz', 'garfield', 'lucifer'];
tigers = ['shere khan', 'hobbes', 'rajah'];

async.parallel({

        cats: async.apply(cats.forEach(function(item){

            if(item == 'garfield')
                console.log('hide your lasagna');
            else
                console.log('all safe');

        })),

        tigers: async.apply(tigers.map(function(item){

            if(item == 'hobbes')
                return 'eats tuna';
            else
                return 'eats people';

        }))

    }, function(error, results){

        if(error)
            console.log(error); return;

        meals = JSON.parse(results['tigers']);
        console.log('tiger meals: '+meals);

});

这是我得到的错误:

TypeError: Cannot call method 'apply' of undefined

出了什么问题?

另外,作为一个附带问题,如何在此处实施async.forEachasync.map

2 个答案:

答案 0 :(得分:2)

您的代码段中存在几个主要问题。

  • async处理异步函数。异步函数不能使用return关键字返回值,因为这是同步模式。异步函数必须将回调函数作为其最后一个参数,并在完成后调用它。你的匿名工作者功能都不符合这一点。
  • Array.forEach不会返回任何内容,但您正在使用它,就像它一样。 async.apply期望函数作为它的第一个参数。

一步一步开始:

编写一个命名函数,在单个参数

上以异步样式执行您想要的操作
function shouldWeHideTheLasagna(item, callback) {
   if (item === 'garfield') {
     process.nextTick(function () {
       callback(null, true);
     });
  } else {
    process.nextTick(function () {
      callback(null, false);
    });
  }
}

了解如何在没有异步的情况下直接使用它。然后练习将其与async.map一起使用,async.map(cats, shouldWeHideTheLasagna, function (error, results) {});然后为老虎重复一次,希望现在有足够的灯泡,你将准备尝试async.parallel与sub-asyncs的组合。但这是一个棘手的事情,所以一步一步地慢慢去理解每个步骤的工作原理。

答案 1 :(得分:0)

我认为你误解了async的用途。 Async旨在用于已经异步的函数,并为回调提供组织。例如,如果您需要按顺序调用三个IO事件,则可以使用Async.series确保每个事件都在之前运行,而不必担心callback hell

在您的场景中,您的所有函数都是同步的,因此,async实际上不会改善您的运行时。我建议使用核心数组原型,如Array.map和Array.forEach。