2013-12-10 29 views
1

我想製作一個自定義的dojo JsonRest商店,在query函數中有一部分我不明白。我想做一個自定義的dojo JsonRest商店,有一個我不明白的部分

這是我不完全瞭解的部分:

var results = xhr("GET", { 
     url: this.target + (query || ""), 
     handleAs: "json", 
     headers: headers 
}); 
results.total = results.then(function(){ 
     var range = results.ioArgs.xhr.getResponseHeader("Content-Range"); 
     return range && (range = range.match(/\/(.*)/)) && +range[1]; 
}); 
return QueryResults(results); 

據我瞭解,它試圖從URL獲取對象的數組,然後總的記錄追加到results這是一個deferred?你能做到嗎?它看起來像該函數返回一個布爾值而不是整數。

無論如何,我試圖以我自己的方式複製那部分代碼。

var result = request.post(this.target + "/get", 
{ 
    data: dojo.toJson(requestParam), 
    handleAs: "json", 
    headers: { 
     Accept: "application/json", 
     "Content-Type": "application/json" 
    } 
}); 

var results = result.then 
(
    function (result) 
    { 
     return (result.entities?result.entities:{}); 
    } 
); 

results.total = result.then 
(
    function (result) 
    { 
     return result.total; 
    } 
); 

results.total.then(function(total){ 
    console.log("total results: ", total); 
}); 

return QueryResults(results); 

total是不確定的,我認爲這是因爲results是延遲不是一個數組。我只是不明白。我如何以我自己的方式重新創建這個功能?

回答

1

首先,要回答有關query方法如何返回的問題,是的,total是返回值的屬性。返回值和total都允許爲立即值或承諾。

在粘貼的第一個代碼中,results.total通常會返回一個數字,而不是布爾值。 return range && (range = range.match(/\/(.*)/)) && +range[1];將首先嚐試在正斜槓後面拉取Content-Range標頭的內容,如果成功,則將其強制轉換爲數字並將其返回。

RE你的代碼,你很可能發現total是不確定的,因爲dojo/request返回的承諾(最好在返回全Deferreds),並承諾在支持ES5,這將阻止您添加total屬性,以它的瀏覽器凍結。您可能會希望使用lang.delegate來創建一個新的基於承諾來解決此限制的對象。

另外,結果的默認值應該是一個空數組,而不是空對象。

+0

當我使用委託將它返回一個承諾或延期? – William

+0

Nvm我已經設法讓它工作。謝了哥們。 – William

相關問題