从dojo.xhrget返回json对象

时间:2013-09-24 11:35:15

标签: json dojo

我试图从dojo xhrGet调用中获取json对象。

我想要的是jsonobject = stuff;

我可以在控制台中看到json对象,但无法访问它!



   var xhrargs = {
    url: "/rest/url",
    handleAs: "json",
    preventCache : false,
    load: function(json_results){
      console.log(json_results);
      store = json_results;
      return dojo.toJson.json_results;
    },
    error: function(response, ioArgs) {
      console.error(response);
      console.error(response.stack);
    }   
   };

    var deferred = dojo.xhrGet(xhrargs);
    console.log("Json is "+JSON.stringify(deferred));


显示json_results的console.log部分很好,正是我想要的。

2 个答案:

答案 0 :(得分:3)

dojo.xhrXXX方法是异步的。这意味着以下几行

var deferred = dojo.xhrGet(xhrargs);

在对外部端点的调用正在处理时将继续执行。这意味着您需要使用promise API来告知在XHR请求完成后要执行的某个代码块:

var deferred = dojo.xhrGet(xhrargs);
deferred.then(function(result){
    //this function executes when the deferred is resolved (complete)
    console.log('result of xhr is ',result);
});

由于请求的异步性质,对于大多数意图和目的而言,该值不存在于回调函数的范围之外。围绕此构建代码的一种方法是使用多个块。例如:

var xhrLoaded = function(results){
    console.log('results = ',results);
    store = results;
}

var  performXhr = function(){
    var xhrargs = {
        url: "/rest/url",
        handleAs: "json",
        preventCache : false,
        error: function(response, ioArgs) {
          console.error(response);
          console.error(response.stack);
        }   
    };
    var deferred = dojo.xhrGet(xhrargs);
    deferred.then(xhrLoaded);
}

performXhr();

您仍然可以访问函数范围之外的变量(例如,如果全局定义store)。

答案 1 :(得分:0)

尝试

    var xhrArgs = {
              url:"MethodName.action?Id="+id,
              handleAs: "json",
              load: function(Data){               
                var values = Data;  
                var count = Object.keys(values).length // gives u all keys count in a json object. In mine it is 0,1,2,3

                for (var i =0; i<count; i++){
                    var temp = values[i]; // values['name']
                  // do somthing ..
                    }
                }                   
              },
              error: function(error){       
                      alert(error);
              }                   
    }
    dojo.xhrPost(xhrArgs);