2012-10-06 12 views
21

Czy mogę liczyć na mapowanie nodeIDs jest zakończone za każdym razem, gdy wywoływana jest funkcja doSomething()?Czy plik Node.js Array.map() jest asynchroniczny?

nodeIDs = $.map(nodeIDs, function(n){ 
    return n.match(/\d+$/); 
}); 
doSomething(nodeIDs); 

Myślałem, że wszystkie wywołania zwrotne w pliku node.js są asynchroniczne? Czytałem artykuł o programowaniu ogólnym, że wywołanie zwrotne może być synchroniczne, ale nie jestem pewien co do pliku node.js?

+0

co to jest tutaj? map pobiera funkcję wywołania zwrotnego, aby zastosować ją do każdego elementu listy, a nie wywołania zwrotnego po zakończeniu iteracji. – chovy

+0

Dzięki chowii.Jeśli chodzi o $, po prostu eksperymentowałem z modułem jQuery i nie zadawałem sobie trudu, żeby to zmienić. – bonchef

Odpowiedz

32

JavaScript jest również funkcjonalnym językiem programowania. To, co tu masz, to "funkcja wyższego rzędu", funkcja, która przyjmuje funkcję jako parametr. Funkcje wyższego rzędu są synchroniczne (ale patrz uwaga poniżej).

Źródło:

map() jest typowym przykładem funkcję wyższego rzędu. Zajmuje funkcję i stosuje ją do wszystkich elementów tablicy. Definicja brzmi bardzo "funkcjonalnie". Ta funkcja nie jest również zapewniana przez węzeł. Jest to udokumentowane przez MDN Array.prototype.map() i określone przez ECMAScript 5.1.

Aby odpowiedzieć na pytanie: Tak, doSomething(nodeIDs) jest nazywane po wszystkie elementy zostały zastosowane.


Uwaga: Funkcja wyższego rzędu jest pojęciem programowania funkcjonalnego. JavaScript jest funkcjonalny, ale również głęboko osadzony w praktyczności wykonywania kodu wewnątrz przeglądarki lub na serwerze. Powiedziałbym, że na przykład setTimeout() nie jest funkcją wyższego rzędu, nawet jeśli przyjmuje funkcję jako parametr, ponieważ setTimeout() nie jest tak naprawdę czysto funkcjonalna, ponieważ wykorzystuje czas. Czysta funkcjonalność jest ponadczasowa. Na przykład wynik map() nie zależy od czasu. I o to właśnie chodzi w tym pytaniu. Jeśli coś nie zależy od czasu, wykonasz je synchronicznie. Problem rozwiązany.

Dzięki Simonowi za kwestionowanie definicji funkcji wyższego rzędu w JavaScript.

+0

Dzięki nalply. Patrzenie na referencyjną implementację map() pomaga. – bonchef

+0

* Funkcje wyższych rzędów są synchroniczne * - naprawdę? setTimeout jest także funkcją wyższego rzędu, ale jest asynchroniczny. –

+0

@ SimonA.Eugster Masz rację. Jeśli ściśle zdefiniujesz funkcje, które przyjmują funkcje jako parametry "wyższego rzędu", wówczas funkcje asynchroniczne są również "wyższego rzędu". Co nazwałbyś funkcjami synchronicznymi, które przyjmują funkcje jako parametry? – nalply

0

Ta funkcja jest synchroniczna - w przeciwnym razie nie może zwrócić wyniku operacji na mapie.

Wszelkie zwroty, które mogą zająć więcej czasu (głównie z powodu IO) są asynchroniczne w nodejs - chyba że metoda jest wyraźnie oznaczona jako synchroniczna (np. fs.readFileSync - ale nie korzysta z oddzwaniania). Prawdopodobnie pomyliłeś to.

+0

Dzięki ThiefMaster. Rozumiem część wersji IO funkcji synchronizacji i asynchronizacji, które były używane w przeszłości. Aby ponownie wyrazić moje pytanie lepiej: biorąc pod uwagę segment kodu, gdy nie ma połączeń zwrotnych, mogę założyć przepływ synchroniczny. Ale kiedy są wywołania zwrotne, nie ma oczywistego sposobu potwierdzenia w jedną lub w drugą stronę? Jeśli OO są zaangażowane, prawdopodobnie są asynchroniczne. Ale w przypadku map() nie byłem tego taki pewien - ani nodejs, ani odwołania do Javascriptu tego nie określają. Więc jak mogę powiedzieć o następnej funkcji biblioteki, którą napotykam? – bonchef

+0

Dokumenty to stwierdzają. Na przykład. http://nodejs.org/api/fs.html#fs_fs_rename_oldpath_newpath_callback "zmiana nazwy asynchronicznej" – ThiefMaster

11

Tak, .map jest synchroniczna. "Oddzwanianie" nie oznacza "asynchronicznego".

+1

Dzięki Charmander. Chciałem powiedzieć "w razie wątpliwości, załóżmy, że wywołania zwrotne można nazwać asynchronicznie w innym czasie". Tak więc prawdziwe pytanie brzmi (zobacz moje komentarze powyżej) - Ogólnie jak mogę stwierdzić, czy dana funkcja biblioteki jest asynchroniczna czy nie? – bonchef

+0

Funkcje pliku node.js są na przykład dobrze udokumentowane, ale inne, takie jak mapowanie tablic, nie mogą znaleźć tej konkretnej informacji. – bonchef

+0

Dzieje się tak, ponieważ nie są dostarczane przez węzeł. Należą one do środowiska wykonawczego V8. V8 implementuje ECMAScript. Dokumentacja "Array.map()" jest tu dokumentowana: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/map. – nalply

3

import moduł async mieć asynchroniczny 'map metody'

var async = require('async'); 

var arr = ['1','2']; 
async.map(arr, getInfo, function (e, r) { 
    console.log(r); 
}); 

function getInfo(name, callback) { 
    setTimeout(function() { 
    callback(null, name + 'new'); 
    }, 1000); 
} 
Powiązane problemy