2014-03-31 72 views
3
「取」事件後

所以我有這個非常簡單的用例:骨幹結合「重啓」與承諾

init: function() { 
    app.products = new app.Collections.Products(); 
    app.categories = new app.Collections.Categories(); 

    var collections = [app.products, app.categories]; 
    var complete = _.invoke(collections, 'fetch'); 

    $.when(null, complete).then(function(){ 
     // fetched, but no models 
    }); 
}; 

這工作得很好,從一個角度XHR點,但回調裏面,模特因爲相應的收藏品尚未創建。有沒有辦法在這個基於承諾的解決方案中從「獲取」中尋找「重置」事件?

+0

的車型應該已經被重置的事件被觸發時創建的......它看起來並不像你在這裏綁定到復位事件 –

+1

@BenjaminGruenbaum我重複不同意。可能有一些可能的重疊,可能是因爲你最近對你的答案進行了編輯,但重複的確是在推動它。 – nikoshr

+0

@nikoshr他的問題是,他不知道如何promisify API。即使在最近的編輯之前,我有一個'.onload'的案例,這實際上是同一件事情 - 我做了編輯「以防萬一」。這個問題是關於將回調API(骨幹同步事件)轉換爲promisified的。這些重複時不時。沒有什麼特別的骨幹,或他的情況在這裏。這是完全相同的問題。 –

回答

0

您可以建立自己的延遲來協調您的呼叫。例如,你可以在你的收藏品的原型添加此功能:

function promiseSync() { 
    var dfd = $.Deferred(); 
    this.once('sync', function() { 
     dfd.resolve(); 
    }); 
    return dfd.promise(); 
} 

app.Collections.Products.prototype.promiseSync = promiseSync; 
app.Collections.Categories.prototype.promiseSync = promiseSync; 

,然後完全按照自己的要求去做,結合延期:

var syncs = _.invoke(collections, 'promiseSync'); 
$.when.apply(null, syncs).then(function(){ 
    console.log('syncs'); 
}); 

並演示http://jsfiddle.net/nikoshr/Xb9Mk/

請注意使用$.when.apply(null, array)$.when(null, array)會立即解決,這可能是爲什麼你在回調中看不到你的模型。

0

使用此代碼,您將獲得您的產品和類別集合,並使用其模型進行填充。

deferredFetch函數設置延遲對象,並在收集完成後解析它。通過使用{reset: true}選項呼叫fetch,Backbone將填充集合並觸發一個事件而不是多個add事件。

init只提取這兩個集合,並且then執行註釋的代碼塊。 productscategories傳入,因爲延遲對象已使用reset偵聽器中的對象解決。

function deferredFetch(collection) { 
    var deferred = $.Deferred(); 
    collection.once('reset', function(collection) { 
     deferred.resolve(collection); 
    }); 
    collection.fetch({ reset: true }); 
    return deferred; 
} 

init: function() { 
    app.products = new app.Collections.Products(); 
    app.categories = new app.Collections.Categories(); 

    $.when(deferredFetch(app.products), deferredFetch(app.categories)) 
    .then(function(products, categories) { 
     // do yo thang 
    }); 
}