0

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

 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 状态下返回一个未定义的状态(这里当我评论同步属性时)。它仅在 sync = true 时返回正确的数据输出。因此,由于 chrome 和 IE 会阻止同步调用的所有其他操作,因此这会导致 chrome 和 IE 在加载样式时出现问题。

我该如何克服这种情况?我的代码的实际问题是什么?

4

1 回答 1

3

您需要更好地掌握同步和异步代码背后的理念。

这正是它返回的情况undefined,因为它没有同步并且值还不可用。当你设置为同步时,其余代码执行将等待函数返回,否则你让代码继续执行而不等待结果。

当你编写异步代码时,你不应该期望它在下一行代码中返回一个值,因为它很可能不会。相反,您应该在返回值可用时创建事件或回调。在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 */ });
于 2012-08-02T11:26:50.120 回答