Dojo:异步xhrGet返回 - 未定义?

时间:2012-08-02 10:18:53

标签: dojo

我写了一个函数来检索这样的各种咏叹调的所有数据..

 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会阻止同步调用上的所有其他操作。

我怎样才能克服这种情况?我的代码有什么实际问题?

1 个答案:

答案 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 */ });