2014-07-08 28 views
9

funkcji jest następująca:Czy map() w javascript jest synchroniczna?

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

Moja oczekiwane zachowanie jest coraz tylko 1 jako wyjścia, chyba że odkomentuj

//return 'something' 

Ale ja naprawdę

1 
2 
3 

Co robię źle?

UPDATE:

jestem testowania że z nodejs.

Naprawdę nie rozumiem.

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); 
     } 
); 

Zarówno powrócić samo

1 
2 
3 

I naprawdę chciałbym czekać, aż dostanę zwrot lub oddzwanianie do następny element jest wykonywany.

SOLVED

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

jest sposób, aby to zrobić.

+2

Dlaczego to jest twoje "oczekiwane zachowanie"? – Alnitak

+0

Jaką przeglądarkę próbujesz?dla google chrome otrzymuję wynik zgodnie z oczekiwaniami w obu przypadkach. – robieee

+0

Uwaga: map wywołuje funkcję zwrotną raz dla każdego elementu w tablicy. To co mam w Google Chrome debugera: [1,2,3] .map (function (poz) { console.log (pozycja); // return 'coś'; }) 1 VM63: 4 2 VM63: 4 3 VM63: 4 [niezdefiniowane niezdefiniowane niezdefiniowane] [1,2,3] .map (funkcja (pozycja) { console.log (pozycja) zwrotny " coś "; }) 1 VM66: 4 2 VM66: 4 3 VM66: 4 [" coś "," coś "," coś "] – robieee

Odpowiedz

21

Tak, mapa jest zsynchronizowana.
Jest to funkcja wyższego rzędu, która przyjmuje nową funkcję i stosuje ją do danej tablicy.

Niektórzy uważają, że ponieważ dają funkcję jako parametr do map, to "powinno" działać jak funkcja wywołania zwrotnego zdarzenia, ale tak naprawdę nie działa. Funkcja map po prostu stosuje parametr funkcji do tablicy i dopiero po jej zakończeniu kontynuuje wykonywanie dla kodu wynikowego po bloku mapy.

Co do Twojego "oczekiwanego zachowania" - to po prostu nie działa tak, jak myślisz;)

1

"Metoda map() tworzy nową tablicę z efektami wywołania funkcji dla każdego elementu w tej tablicy."

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

Funkcja zwrotna jest wywoływana dla każdej pozycji, logika jest wykonywany i zwracana wartość jest ustawiona jako pozycja w nowej tablicy.

+0

Innymi słowy "mapa funkcji (f, xs) {var out = []; dla (var i = 0; i [2,3,4] ' – elclanrs

+0

czy to oznacza map() wykonywać te funkcje równolegle? – user3815910

+0

Array.map wykonuje synchronizacje zwrotne. –

0

Niewyraźne z oczekiwanym zachowaniem, gdzieś w jednym ze swoich usuniętych postów znalazło się, że korzystasz z mapy asynchronicznej.

tego linku:

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

nadzieję, że to pomoże.

+0

oczekiwane zachowanie jest takie, że mapa nie wykonuje tej funkcji innym razem, aż poprzedni zwrócił coś. – user3815910

+0

Chciałbym mieć coś, co blokuje dalsze wykonywanie kodu, dopóki nie zwrócę xyz; lub callback (null, xyz); – user3815910

+0

Proszę odnieść się: https://github.com/caolan/async#maphttps://www.acolan/async#map – robieee