2013-01-12 51 views
1

在下面的代碼,我檢索使用$.getJSON(返回形式存儲庫)和$.when作爲最後的通話是依賴於從第一個數據數據:

var getData = 

    function() { 

     var data = { userData: null, userTitles: null, userPage: null }; 

     $.when(repository.getUserDetails().done(f1)), 
        repository.getUserPolicyTitles().done(f2) 
      .then(repository.getUserPage().done(f3)); 


     function f1(userData) { data.userData = userData; console.log(data.userData) }; 
     function f2(userTitles) { data.userTitles = userTitles; console.log(data.userTitles) }; 
     function f3(userPage) { data.userPage = userPage; console.log(data.userPage) }; 

     return data; 
    } 

    return { 
     getData: getData 
    }; 

大部分工作正常。但是,我想將數據返回給調用模塊,但是在數據準備好之前它會返回,因爲我認爲您會期望。

達到此目的的最佳方法是什麼?

感謝

戴維

+2

的'$。當()'表達沒有意義。它有一個論點,後面跟着一個','。你確定括號'()'在正確的位置關閉嗎? –

+0

謝謝,我認爲文檔說你可以在$ .when中傳遞多個函數 - 基本上在執行$ .then中的第三項之前執行它們。 – davy

回答

2

您對延期的使用看起來不正確。這是我的解釋。

另外,您需要考慮一旦開始調用異步方法,就無法進行同步返回調用,這就是您正在做的。您不需要返回數據,而需要返回一個承諾;那麼你提供一個回調的承諾,會做的東西與數據

var getData = function() { 
    var myDeferred = $.Deferred(); 
    var data = { userData: null, userTitles: null, userPage: null }; 

    $.when(repository.getUserDetails().done(f1), 
      repository.getUserPolicyTitles().done(f2), 
      repository.getUserPage().done(f3)).then(
     function(){ myDeferred.resolve(data); }, 
     function(){ myDeferred.reject.apply(myDeferred, arguments); }); 

    //... f1, f2, f3 

    return myDeferred.promise(); 
} 

return { 
    getData: getData 
}; 

然後,當你想實際使用數據,你做

your_library.getData().then(function(data){ 
     // magic goes here 
    }, function(errors_of_some_sort) { 
     // error handling magic goes here 
    }); 
+0

感謝您的一個很好的解釋。我嘗試過類似的東西,但不能把它放在一起。 – davy

0

當使用$。當,你只能得到數據的所有Ajax調用已經返回後。因此,例如:

$.when($.getJSON('somewhere'), $.getJSON('somewhere2')) 
.done(function(r1, r2){ 
    //set your data object with the responses from the server here 
}); 

那麼簡單的答案是,你不能「迴歸」從服務器檢索到的數據,但你可以指定一個回調使用數據(或設置爲你的模塊的一些實體)當數據準備就緒時。