我试图从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部分很好,正是我想要的。
答案 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);