2013-11-27 3 views
1

У меня есть два отдельных массива, которые мне нужно обработать. Поскольку они не являются взаимозависимыми, я хотел бы сделать это асинхронно.Работа с массивами с async.parallel

Вот мой код:

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.forEach и async.map здесь?

ответ

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.параллельно с sub-asyncs. Но это сложная вещь, поэтому идите медленно шаг за шагом и понимайте, как работает каждый шаг.

+0

Это очень хорошие указатели, спасибо! Теперь я вижу, как я ошибаюсь «асинхронно» для «многопоточных». – CrackerKraken

0

Я думаю, что вы неверно истолковываете, для чего используется асинхронный режим. Async предназначен для использования для функций, которые уже являются асинхронными, и обеспечивает организацию для ваших обратных вызовов. Например, если вам нужно было последовательно вызвать три события ввода-вывода, вы можете использовать Async.series, чтобы гарантировать, что каждый из них будет запущен после предыдущего, не беспокоясь о callback hell

В вашем сценарии все ваши функции синхронны , и поэтому async не улучшит ваше время выполнения. Вместо этого я бы рекомендовал использовать базовые прототипы Array, такие как Array.map и Array.forEach.

Смежные вопросы