2014-07-08 26 views
9

funzione è:È map() in javascript sincrono?

[1,2,3].map(function (item) 
{ 
    console.log(item); 
    //return 'something'; 
}); 

mio comportamento previsto è sempre solo 1 come uscita, a meno che io rimuovere il commento le

//return 'something' 

Ma, proprio mi piace

1 
2 
3 

Che cosa sto facendo di sbagliato?

UPDATE:

Sto verificando che con nodejs.

davvero non capisco.

var async = require("async"); 

[1,2,3].map(function (item) 
{ 
     console.log(item); 
     //return 'something'; 
}); 
async.map([1,2,3], function (item,callback) 
    { 
     console.log(item); 
     //callback(null,true) 
    }, function (err,result) 
     { 
      console.log(result); 
     } 
); 

Entrambi restituiscono lo stesso

1 
2 
3 

E mi piacerebbe davvero aspettare fino a ottenere un ritorno o una richiamata fino alla voce successiva viene eseguita.

risolto

async.mapSeries([1,2,3], function (item,callback) 
    { 
     console.log(item); 
     //callback(null,true) 
    }, function (err,result) 
     { 
      console.log(result); 
     } 
); 

è il modo per farlo.

+2

Perché è che il "comportamento previsto"? – Alnitak

+0

Quale browser stai provando?per Google Chrome sto ottenendo il risultato come previsto in entrambi i casi. – robieee

+0

Nota: mappa chiama una funzione di callback fornita una volta per ciascun elemento in una matrice. Questo è quello che ho ottenuto in Google Chrome debugger: [1,2,3] .map (function (item) { console.log (voce); // ritorno 'qualcosa'; }) 1 VM63: 4 2 VM63: 4 3 VM63: 4 [indefinito, indefinito, indefinito] [1,2,3] .map (funzione (elemento) { console.log (voce); ritorno ' qualcosa '; }) 1 VM66: 4 2 VM66: 4 3 VM66: 4 [ "qualcosa", "qualcosa", "qualcosa"] – robieee

risposta

21

Sì, la mappa è sincrona.
È una funzione di ordine superiore, che accetta una nuova funzione e la applica all'array specificato.

Alcune persone pensano che poiché assegnano una funzione come parametro a map, allora "dovrebbe" comportarsi come una funzione di callback di un evento, ma in realtà non lo è. La funzione map applica semplicemente il parametro funzione all'array e solo dopo il suo completamento, continua l'esecuzione per il codice risultante dopo il blocco della mappa.

Quanto alla tua 'comportamento previsto' - semplicemente non funziona come si pensa;)

1

"Il metodo map() crea un nuovo array con i risultati della chiamata di una funzione fornita su ogni elemento di questo array."

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

Il callback viene chiamata per ogni elemento, viene eseguita la logica ed il valore restituito è impostato come un elemento del nuovo array.

+0

In altre parole 'function map (f, xs) {var out = []; per (var i = 0; i [2,3,4] ' – elclanrs

+0

significa map() esegue tali funzioni in parallelo? – user3815910

+0

Array.map esegue i callback in modo sincrono. –

0

Non chiaro con il tuo comportamento previsto, da qualche parte in uno dei tuoi post cancellati passato trovato che stai utilizzando una mappa asincrona.

provare questo link:

http://runnable.com/UyR-6c2DZZ4SmfSh/async-map-example-for-node-js

spero che vi aiuterà.

+0

il comportamento previsto è, quella mappa non sta eseguendo questa funzione un'altra volta fino a quando il precedente stava restituendo qualcosa. – user3815910

+0

mi piacerebbe avere qualcosa che sta bloccando qualsiasi ulteriore esecuzione del codice fino a quando non restituisco xyz; o callback (null, xyz); – user3815910

+0

Si prega di fare riferimento a questo: https://github.com/caolan/async#map – robieee