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?
risposta
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)
.
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 inarr
. L'iteratore viene passato acallback(err, transformed)
che deve essere chiamato una volta completato con un errore (che può esserenull
) e un articolo trasformato.callback(err, results)
- Un callback chiamato quando tutte le funzioniiterator
sono terminate o si verifica un errore. I risultati sono un array degli articoli trasformati dalloarr
.
arrivare al cuore della risposta alla tua domanda, async.map
Mappe 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
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.
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.
Suppongo tu abbia letto i documenti di ciascuna funzione? Di cosa esattamente non sei chiaro? – Bergi