我写了一个函数来检索这样的各种咏叹调的所有数据..
function retrieveData(dom_sclapi) {
var apiResponse;
dojo.xhrGet({
url : dom_sclapi,
handleAs: handle,
//sync: true,
headers: { "Accept": "application/json" },
preventCache: true,
//Success
load: function(Response) {
apiResponse = Response;
},
// Ooops! Error!
error: function(Error, ioArgs) {
//apiResponse = Error;
//console.log(ioArgs.xhr.status);
}
});
//apiResponse
return apiResponse;
}
但是apiResponse在sync = false状态下返回一个未定义的(这时我评论同步attrribute)。它仅在sync = true时返回正确的数据输出。因此,这会在chrome和IE中加载样式时出现问题,因为chrome和IE会阻止同步调用上的所有其他操作。
我怎样才能克服这种情况?我的代码有什么实际问题?
答案 0 :(得分:3)
您需要更好地掌握同步和异步代码背后的想法。
这正是它返回undefined
的情况,因为它没有同步,价值还没有可用。
当你设置为synchronized时,其余的代码执行将等待函数返回,否则你让代码继续而不等待结果。
当你编写异步代码时,你不应该期望它在下一行代码上返回一个值,因为它很可能不会。
相反,您应该在返回值可用时创建事件或回调。
在收到请求时,load:
是一个回调函数。
另请参阅有关Deferred个对象的文档。它们也在xhrGet
中描述因此,您上面的代码可能会变成这样。
function retrieveData(dom_sclapi, callback) {
// Will return Deferred object
return dojo.xhrGet({
url : dom_sclapi,
headers: { "Accept": "application/json" },
preventCache: true,
// Pass callback function to do something with response
load: callback,
error: function(Error, ioArgs) {
//console.log(ioArgs.xhr.status);
}
});
}
// Or get data by deferred object
retrieveData(url, null).then(function(Response){ /* Do something with response */ })
// Via callback
retrieveData(url, function(Response){ /* Do something with response */ });