2014-07-08 19 views
9

Funktion ist:Ist map() in Javascript synchron?

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

Mein ist das erwartete Verhalten nur 1 als Ausgang bekommen, es sei denn ich die

//return 'something' 

Kommentar- aber ich habe wirklich

1 
2 
3 

Was mache ich falsch?

UPDATE:

Ich teste das mit NodeJS.

ich verstehe wirklich nicht.

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

Beide geben die gleiche

1 
2 
3 

und ich würde wirklich warten möchte, bis ich eine Rückgabe oder einen Rückruf erhalten, bis der nächste Punkt ausgeführt wird.

GELÖST

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

die Art und Weise, es zu tun ist.

+2

Warum ist, dass Ihr „erwartetes Verhalten“? – Alnitak

+0

Welchen Browser versuchen Sie dies?Für Google Chrome bekomme ich in beiden Fällen das Ergebnis wie erwartet. – robieee

+0

Hinweis: Map ruft eine bereitgestellte Callback-Funktion einmal für jedes Element in einem Array auf. Das ist, was ich habe in Google Chrom Debugger: [1,2,3] .map (function (Artikel) { console.log (item); // return 'etwas'; }) VM63 1: 4 VM63 2: 4 VM63 3: 4 [undefinierte, nicht definiert, undefined] [1,2,3] .Map (function (item) { console.log (item); return ' etwas '; }) 1 VM66: 4 2 VM66: 4 3 VM66: 4 ["etwas", "etwas", "etwas"] – robieee

Antwort

21

Ja, Karte ist synchron.
Es ist eine Funktion höherer Ordnung, die eine neue Funktion übernimmt und sie auf das angegebene Array anwendet.

Einige Leute denken, dass, weil sie eine Funktion als Parameter zu map geben, dann sollte es wie eine Ereignis-Callback-Funktion fungieren, aber es tut es wirklich nicht. Die Funktion map wendet den Parameter function nur auf das Array an, und erst nach der Ausführung wird die Ausführung für den resultierenden Code nach dem Map-Block fortgesetzt.

In Bezug auf Ihr ‚erwartetes Verhalten‘ - es funktioniert einfach nicht, wie Sie denken;)

1

"Die map() -Methode erstellt ein neues Array mit den Ergebnissen des Aufrufs einer bereitgestellten Funktion für jedes Element in diesem Array."

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

Der Rückruf wird für jedes Element genannt, wird Ihre Logik ausgeführt und der Rückgabewert wird als ein Element in der neuen Array gesetzt.

+0

Mit anderen Worten: Funktionskarte (f, xs) {var out = []; für (var i = 0; i [2,3,4] ' – elclanrs

+0

bedeutet das, dass map() diese Funktionen parallel ausführt? – user3815910

+0

Array.map führt die Callbacks synchron aus. –

0

Nicht klar mit Ihrem erwarteten Verhalten, irgendwo in einer Ihrer Vergangenheit gelöschten Post gefunden, dass Sie mit asynchronen Karte.

versuchen Sie diesen Link:

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

hoffen, dass es Ihnen helfen.

+0

Das erwartete Verhalten ist, dass die Map diese Funktion nicht ein weiteres Mal ausführt, bis die vorherige etwas zurückgegeben hat. – user3815910

+0

Ich möchte etwas haben, das jede weitere Codeausführung blockiert, bis ich xyz zurückgebe; oder Rückruf (null, xyz); – user3815910

+0

Bitte beziehen Sie sich darauf: https://github.com/caolan/async#map – robieee