2014-06-23 68 views
0

嗨,我是新來的backbonejs,backbone.fetch使用「迴歸」只返回undefined,而不是特定值

我如果調用此功能時,通過我的路線和else語句創建一個函數來驗證會話和有

var validateSession = function(){ 
    var session = new sessionCollection(); 
    session.fetch({ 
     success : function(){ 
      return true; 
     }, 
     error : function(){ 
      CarRentalApp.trigger('admin:login'); 
      return false; 
     } 
    }); 
}; 

問題是「返回」聲明不適合我。而不是返回true或false,而是返回undefined。我錯過了什麼嗎?

回答

2

您還可以使用$.Deferred()

var validateSession = function(){ 
    var defer = $.Deferred(); 
    var session = new sessionCollection(); 
    session.fetch({ 
     success : function(){ 
      defer.resolve(true); 
     }, 
     error : function(){ 
      defer.resolve(false); 
     } 
    }); 
    return defer.promise(); 
}; 

然後:

$.when(validateSession()).done(function(result){ 
}); 
+0

謝謝!我也在評論中使用了這個解決方案 –

+0

對不起..沒有讀過上面的評論:) – user2503775

1

我認爲這是一個JavaScript問題,而不是主幹。 Backbone.Collection.fetch方法是異步方法,這意味着,如果你這樣做:

validateSession(); 

功能將調用session.fetch(),然後立即返回,不會等待fetch()方法完成它的工作。你在validateSession函數中沒有return語句,所以它只是返回undefined。當fetch()方法完成時,您將不會收到任何通知。

var validateSession = function(){ 
    var session = new sessionCollection(); 
    session.fetch({ 
     success : function(){ 
      CarRentalApp.trigger('valid:true'); 
     }, 
     error : function(){ 
      CarRentalApp.trigger('valid:false'); 
     } 
    }); 
}; 

然後偵聽這兩個事件,並做一些處理:如果你想獲得session.fetch(),我想你在成功和失敗兩種情況下最好的觸發事件的結果

分別。

希望這可以幫助。

+1

這是正確的...有兩個獨立的時間表回事。如果你使用調試器來完成這個任務,你可以點擊'fetch',然後在讀取後繼續下一個語句。 (或者在這種情況下,退出函數。)要逐步執行'success'函數,您需要在那裏設置單獨的斷點。 – cleaver

+0

謝謝,我早些時候試過這個實現,它對我來說工作得很好。我嘗試的另一個解決方案是在取回之後使用延遲,然後返回defer.promise(),這也可以很好地工作。 –

+0

是的,甚至更簡單,你可以在成功和錯誤回調內完成你想要的內容 - 如果你不需要引用外部變量。 –