2015-05-14 10 views
7

Ho iniziato a lavorare su un progetto di nodo recentemente e ho usato molto la libreria async. Sono un po 'confuso su quale opzione sarà più veloce. Utilizzando async.map su alcuni dati e ottenendo i suoi risultati o usando async.each per iterare su un array di utenti e mettere la loro operazione corrispondente in una serie di chiamate di funzione che eseguo usando async.parallel.Qual è la differenza tra async.map o async.each con async.parallel?

+0

Suppongo tu abbia letto i documenti di ciascuna funzione? Di cosa esattamente non sei chiaro? – Bergi

risposta

2

Simile a JavaScript forEach, async.each accetta tre parametri, il primo dei quali è un array su cui eseguire l'iterazione e il secondo è una funzione da applicare a ciascun elemento dell'array (che è il primo parametro). La forma del secondo parametro è iterator(item, callback) dove iterator è il nome della funzione, callback che è anche una funzione, con il modulo callback(err) che viene chiamato una volta che iterator è stato completato. (Nota:: "Se non si è verificato alcun errore, il callback deve essere eseguito senza argomenti o con un argomento nullo esplicito.") Il terzo parametro di async.each è un callback richiamato dopo l'esecuzione di tutte le funzioni iterator e come il callback di ciascun iteratore ha il formato callback(err).

Source


Di seguito, per brevità, è la forma per gli argomenti di async.map:

  • arr - Un array per scorrere.
  • iterator(item, callback) - Una funzione da applicare a ogni articolo in arr. L'iteratore viene passato a callback(err, transformed) che deve essere chiamato una volta completato con un errore (che può essere null) e un articolo trasformato.
  • callback(err, results) - Un callback chiamato quando tutte le funzioni iterator sono terminate o si verifica un errore. I risultati sono un array degli articoli trasformati dallo arr.

Source


arrivare al cuore della risposta alla tua domanda, async.mapMappe primo parametro a un array chiamando iterator su ogni elemento della matrice che è la sua prima parametro, ma async.map deve restituire un array, mentre lo async.each no. Ciò si riflette nel secondo del terzo parametro di async.map (mi riferisco a results), che deve essere una matrice.Vale a dire che, nel l'esempio più semplice,

async.map([1, 2, 3], function iterator(item, callback_it){ return 2*item; }, callback(err, results)) 

supponendo sia già stata implementata callback_it e callback, quindi nell'esempio precedente [2, 4, 6] verrà passato come secondo argomento della callback

1

quale opzione sarà più veloce

non ti preoccupare. La differenza sarà trascurabile se apparente, e la funzione dedicata è abbastanza ottimizzata. Non provare nemmeno a inventare i tuoi.

Uso async.map su alcuni dati e ottenere i suoi risultati

Se questo è ciò che si vuole fare, usare map. È proprio lì che il tuo essere usato per questo scopo, ed è abbastanza leggibile.

utilizzando async.each per iterare su un array di utenti e inserire l'operazione corrispondente in una serie di chiamate di funzione che eseguo utilizzando async.parallel.

Suona come una cattiva idea. Per lo più, "mettere le funzioni in un array" è un'operazione sincrona, quindi non utilizzare lo async, ma l'array nativo forEach. O meglio, solo

async.parallel(data.map(function(d) { 
    return function(cb) { 
     // do what needs to be done with d and pass cb 
    }; 
}), function(err, results){ … }); 

Ma che sembra molto inutile (e difficilmente più veloce) che solo utilizzando async.map direttamente.

0

una differenza è che async.each e async.map crea le attività per te, inseriscile nell'array di attività e chiama async.parallel con queste attività. Non devi preoccuparti della creazione dell'attività.

La differenza tra async.map e async.each: async.each non consente di ottenere i risultati nel callback dove async.map consente di recuperare i risultati nell'array.