我想制作一个自定义的dojo JsonRest商店,有一部分我不明白

时间:2013-12-10 06:20:46

标签: javascript dojo

我想制作一个自定义的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是延迟而不是数组。我只是不明白。如何以自己的方式重新创建此功能?

1 个答案:

答案 0 :(得分:1)

首先,回答关于query方法如何返回的问题,是的,total是返回值的属性。返回值和total都可以是立即值或承诺。

在您粘贴的第一个代码中,results.total通常会返回一个数字,而不是布尔值。 return range && (range = range.match(/\/(.*)/)) && +range[1];将首先尝试在正斜杠之后提取Content-Range标头的内容,如果成功,将强制转换为数字并将其返回。

重新编写代码,您可能会发现total未定义,因为dojo/request返回承诺(优先于返回完整的Deferred),并且承诺在支持ES5的浏览器中被冻结,这将阻止您添加它的total属性。您可能希望使用lang.delegate根据承诺来创建新对象以解决此限制。

此外,结果的默认值应为空数组,而不是空对象。