2012-10-06 29 views
21

Düğümde güvenebilir miyim? Eşleme her seferinde doSomething() çağrılır mı?Node.js Array.map() eşzamansız mıdır?

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

node.js dosyasındaki tüm geri çağrılar eşzamansız mıydı? Genel programlama ile ilgili olarak, geri bildirimin senkronize olabileceğini ancak node.js hakkında emin olamadığım bir makale okudum?

+0

Burada $ nedir? Harita, listenin her bir üyesine uygulanacak bir geri çağırma işlevi alır, tam yineleme tamamlandığında geri arama değil. – chovy

+0

Teşekkürler chovy.$ Için, sadece node-jquery modülünü denedim ve bunu düzeltmek için uğraşmadım. – bonchef

cevap

32

JavaScript, işlevsel bir programlama dilidir. Burada sahip olduğunuz, bir “üst sıra fonksiyonu”, bir işlevi bir işlev olarak alan bir işlevdir. Yüksek mertebeden fonksiyonlar senkrondir (ancak aşağıdaki nota bakınız).

Kaynaklar:

map() daha yüksek dereceden bir fonksiyon tipik bir örneğidir. Bir işlevi alır ve bir dizinin tüm öğelerine uygular. Tanım çok "fonksiyonel" geliyor. Bu işlev ayrıca Düğüm tarafından sağlanmamaktadır. MDN Array.prototype.map() tarafından belgelendirilmiş ve ECMAScript 5.1 tarafından belirtilmiştir.

Sorunuzu yanıtlamak için: Evet, doSomething(nodeIDs), tüm öğeler uygulandıktan sonra olarak adlandırılır.


Not

:
yüksek mertebeden fonksiyonu işlevsel programlama bir kavramdır. JavaScript işlevseldir, ancak aynı zamanda tarayıcıda veya sunucuda kod yürütmenin pratikliğine derinlemesine oturmuştur. Örneğin, setTimeout() parametresinin bir parametre olarak işlev görse bile daha yüksek bir sıralama işlevi olmadığını söyleyebilirim, çünkü zaman kullandığı için setTimeout() gerçekten işlevsel değildir. Saf işlevsellik zamansızdır. Örneğin, map()'un sonucu zamana bağlı değildir. Ve bu soru gerçekten ilgili. Bir şey zamana bağlı değilse, senkronize olarak yürütürsünüz. Sorun çözüldü.

JavaScript'teki üst düzey siparişin tanımını zorlamak için Simon'a teşekkürler.

+0

Teşekkürler nalply. Map() referans uygulamasına bakmak yardımcı olur. – bonchef

+0

* Daha yüksek sipariş işlevleri senkronize * - gerçekten mi? setTimeout ayrıca bir üst düzey işlevdir, ancak eşzamansızdır. –

+0

@ SimonA.Eugster Bir noktanız var. Fonksiyonları «yüksek mertebeden» olarak parametreler olarak alan fonksiyonlar kesinlikle tanımlarsanız, asenkron fonksiyonlar da «yüksek mertebeden» dir. Fonksiyonları parametre olarak alan senkronize fonksiyonları nasıl çağırırsınız? – nalply

0

Bu işlev senkronize edilir - aksi halde harita işleminin sonucunu geri getiremez.

Daha uzun sürebilir (özellikle IO nedeniyle) herhangi bir geri arama, nodejs'de eşzamansızdır - yöntem açıkça senkronize olarak işaretlenmemişse (fs.readFileSync gibi - ama bu bir geri arama kullanmaz). Muhtemelen bir şekilde kafan karıştı.

+0

Teşekkürler ThiefMaster. IO işlevlerinin Sync ve Async sürümlerinin bir kısmını anlıyorum ve geçmişte de kullandım. Sorgumu daha iyi ifade etmek için: bir kod parçası verildiğinde, geri arama olmadığında senkronize akışı kabul edebilirim. Ancak geri aramalar olduğunda, tek yönlü veya diğerini onaylamanın açık bir yolu yoktur? IO'lar söz konusu ise, bunlar asenkrondır. Ancak haritada() durumda çok emin değildim - ne nodejs ne de Javascript referansları bunu belirtmiyor. Peki karşılaştığım bir sonraki kütüphane fonksiyonunu nasıl anlatabilirim? – bonchef

+0

Dokümanlar bunu belirtir. Örneğin. http://nodejs.org/api/fs.html#fs_fs_rename_oldpath_newpath_callback "eşzamansız yeniden adlandır" – ThiefMaster

11

Evet, .map eşzamanlıdır. "Geri arama", "senkronize olmayan" anlamına gelmez.

+1

Teşekkürler Charmander. 'Şüpheye düştüğünde, geri aramaların farklı bir zamanda eşzamansız olarak çağrılabileceğini varsayalım' demek istedim. Yani asıl soru şu ki (yukarıdaki yorumlarıma bakın) - Belirli bir kütüphane fonksiyonunun uyumsuz olup olmadığını nasıl anlayabilirim? – bonchef

+0

node.js Dosya işlevleri örneğin iyi belgelenmiştir, ancak dizi eşlemesi gibi diğerleri, bu belirli bilgi parçasını bulamıyor gibi görünmüyor. – bonchef

+0

Bu, Düğüm tarafından sağlanmadıkları için. V8 çalışma zamanına aitler. V8 ECMAScript'i uygular. Array.map() 'burada belgelenmiştir: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/map. – nalply

3

bir uyumsuz 'map' yöntemini

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

yararlı lib awaiting yoktur olması async modülü almak. Ve map size yardımcı olacaktır.