2012-08-28 25 views
24

Backbone.js'de biraz yeniyim, ancak benim için yapabileceği her şeyden çok etkilendim ve şimdi kalıpları ve en iyi uygulamaları öğrenmeye çalışıyorum.Birden çok Backbone.js getirme nasıl senkronize edilir?

var CollA = Backbone.Collection.extend({ 
    model: ModelA, 
    url: '/urlA' 
}); 

var CollB = Backbone.Collection.extend({ 
    model: ModelB, 
    url: '/urlB' 
}); 

var collA = new CollA; 
var collB = new CollB; 

benim uygulaması yüklenirken, ben sunucudan bu koleksiyonları iki getirir ve her iki getirmelere tamamlamış olacağının hiçbir garantisi yoktur Bazı önyükleme kodunu çalıştırmak gerekir:

İki koleksiyonları var.

İşte şimdilik öyle yapmıştım:

collA.fetch({success: function() { 
    collB.fetch({success: function() { 
     // run the needed code here. 
    }}); 
}}); 

Bu işler, gerekli kod hem başarıyla tamamlamak getirir sonra sadece çalıştırmak için garanti edilir. Yine de, verimsiz bir şekilde etkisizdir, çünkü getiriler seri olarak, birbiri ardına koşar.

Bunu yapmak için daha iyi bir desen ne olurdu, getirileri paralel olarak çalıştırmak ve her iki alım başarılı bir şekilde tamamlandıktan sonra bazı kodları çalıştırmak için?

cevap

50

jQuery kullanıyorsanız, when kullanın:

$.when(collA.fetch(),collB.fetch()).done(function(){ 
    //success code here. 
}); 

Geçmiş:

Sen $.when bir veya birden fazla deferreds geçmek. Böylece koleksiyonların geri döndüğü "jqXHR" nin, $.when kullanarak yeni bir vaatte birleştirilebilecek vaat/Ertelenmiş arabirimi uyguladığı görülür. İstekler esas olarak eşzamanlı olacaktır (javascript'in izin verdiği ölçüde) ve .done'a aktarılan işlev yalnızca her iki alım başarılı olduğunda yürütülür.

+0

teşekkürler. Hepsi harika cevaplar, bu sadece bana estetik açıdan daha estetik bir şekilde daha hoş geliyor. Ve evet, tüm yük stratejisini yeniden yapılandırmak da bu durumda Backbone'un kendisinin önerdiği şeydir. Ancak bazen birden çok paralel getirme ve senkronizasyon uygun şeydir ve bu harika çalışır.Alt çizgi için – Jaanus

2

Her koleksiyonu tek tek almak zorunda kalırsanız JayC'nin yanıtını beğenirim. Sunucuya tek bir getirmenin birden çok getirme işleminin aksine daha iyi olacağını iddia edebilirsiniz. Bu veriyi uygulama yüküne getiriyorsanız, sunucuya tek bir çağrı yapar ve verileri ilgili koleksiyonlarınıza iletirim. Gerçekten uygulama yükü üzerinde kaç tane koleksiyon almanız gerektiğine bağlı, ancak ben sunucuya bir çağrı yapmayı ve ardından verileri ilgili koleksiyonlarıma aktarmayı tercih ediyorum. Eğer api manipüle edebilir ve yukarıdaki DİĞERLERİNİ takip etmezse

$.ajax({ 
    url: "path/to/app-load-data" 
}).done(function(data) { 
    collA = new CollA(data.collA); 
    collB = new CollB(data.collB); 
}); 

Bu

açıkçası bağlı olacaktır. Fakat daha sonra birden fazla aramanın tersine sunucuya bir çağrı yapıyorsunuz.

28

@JayC, jQuery'den $.when'u kullanabileceğinizi belirtti, tercih ettiğim diğer seçenek, bekletilen çağrılar tamamlandıktan sonra bir kez çalıştırılan after işlevidir (Underscore).

http://underscorejs.org/#after

function runMyApp(){ 
    // run the needed code here. 
    console.log('This will run one time but until both fetch are being completed.'); 
} 

//2 because you have two collections 
var renderApp = _.after(2, runMyApp); 
collA.fetch({success: renderApp}); 
collB.fetch({success: renderApp}); 
+1

+1. Ne harika bir kütüphane! – swatkins

+2

Bu kullanışlı küçük işlevi hiç bilmiyordum ...! +1. – TYRONEMICHAEL

+0

Güzel, bu çok kullanışlı! – gustavohenke

İlgili konular