2012-09-23 71 views
3

這與使用骨幹網的客戶端或服務器端應用程序相關。我正在嘗試創建一個驗證函數,對MongoDB或某些REST調用(取決於環境)進行唯一性檢查。這兩種調用本質上都是異步的;不過,我想我實際上需要在此處進行驗證。如果我不返回任何驗證函數將假定驗證通過。如何在使用Backbone.js(唯一性)進行驗證時處理異步調用

我的代碼目前看起來像這樣在服務器端:

isUnique: function (key) { 
    var dfdFindOne = this.findOne({key: this.get(key)}), 
     dfd = new Deferred(); 
    dfdFindOne.done(function (err, result) { 
     console.log(result); 
     dfd.resolve(true); 
    }); 
    return dfd; 
}; 

...這裏的一些東西....
我覺得我可以我以前在這裏做一些等到完成功能返回...也許不是。我希望骨幹提供了一個回調函數或某種東西或接受某種延遲類型的東西。

validate: function() { 
    var result = undefined; 
    if(!this.isUnique(key).done(function(){ 
     result = "AHHH not unique!"; 
    }); 
    return result; 
} 

一個可能的解決方案可能是強制mongodb的本地節點客戶端同步調用事物。我想我可以在休息電話中做同樣的事情......但這可能是一個糟糕的解決方案。

回答

2

你可以調用ajax請求並設置async:false,這樣返回值就會有價值。然而,要使用異步:false是邪惡的,因爲可能會出現在瀏覽器被鎖定。對於服務器端來說,可能並不總是用於設置異步的解決方法:false

我的建議是使用您自己的驗證流程而不是Backbone.validate流程,因爲Backbone的驗證流程僅考慮同步驗證。你可以嘗試這樣的:

//Code in your Model 
isUnique: function (callback) { 
    var dfdFindOne = this.findOne({key: this.get(key)}); 
    dfdFindOne.done(function (err, result) { 
     console.log(result); 
     callback(result); 
    }); 
}; 
validate: function(callback) { 
    this.isUnique(callback); 
} 

//trying to validate before save 
model.validate(function(result){ 
    if(result == 'whatexpected'){ 
    model.save(); 
    } 
}); 
+0

這是一個很好的解決方案;然而,我相信在文檔中提到驗證在使用「set」時也會被調用,這意味着我要麼需要重寫set,要麼使用alternate方法和call set,這可能會導致一些混淆。對此有何想法? – Parris

+1

我知道驗證將在集合中被調用,但是因爲我們的新驗證不會返回任何關於Backbone的東西,這意味着驗證(在他們的流程中)是可以的。我的解決方法與Backbone沒有衝突。選中「如果這些屬性是有效的,請不要從驗證中返回任何內容;如果它們無效,則返回您選擇的錯誤。」 –

+0

如果您感覺舒服,可以使用其他名稱(如customValidate)調用新驗證,並調用model.customValidate(function(result){但重要的是,對於異步行爲,我們不需要發明輪子,常見解決方案是回調。=) –

相關問題