我想制作一个自定义的dojo JsonRest商店,query
函数中有一部分我不理解。
这是我不完全理解的部分:
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);
据我所知,它试图从网址中获取一个对象数组,然后将所有记录追加到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
是延迟而不是数组。我只是不明白。如何以自己的方式重新创建此功能?
答案 0 :(得分:1)
首先,回答关于query
方法如何返回的问题,是的,total
是返回值的属性。返回值和total
都可以是立即值或承诺。
在您粘贴的第一个代码中,results.total
通常会返回一个数字,而不是布尔值。 return range && (range = range.match(/\/(.*)/)) && +range[1];
将首先尝试在正斜杠之后提取Content-Range标头的内容,如果成功,将强制转换为数字并将其返回。
重新编写代码,您可能会发现total
未定义,因为dojo/request
返回承诺(优先于返回完整的Deferred),并且承诺在支持ES5的浏览器中被冻结,这将阻止您添加它的total
属性。您可能希望使用lang.delegate
根据承诺来创建新对象以解决此限制。
此外,结果的默认值应为空数组,而不是空对象。