0

我下面的函数进行了 AJAX 调用,由于它是返回的无效 JSON 对象,我必须手动将结果解析为有效的 JSON 对象(有效)。问题是当我将 JSON 对象传回给原始调用函数时,该对象没有被正确传回。

如果我只放入第三个警报,它将显示该对象“无效”。但是,如果我将所有三个警报都放入,只有警报 2 会说无效(1 和 3 将显示对象)。这让人相信这可能是在这些变量之间传递对象的某种时间问题。关于如何解决这个问题的任何建议,因为我显然无法在我的最终代码中放置警报。

    function loadDocuments(){
       var myDocuments = getDocs();
       alert('third response ' + myDocuments);
    }

    function getDocs() {            
            var myURL = "someURL";
            var response;
            $.ajax({
                url: myURL,
                type: 'GET',
                dataType: 'json',
                 complete: function(docData) {
                   if(docData.status==200){
                       response = parseDocResults(docData.responseText);
                       alert('first response' + response);                                                   
                   }else{
                       response = "Documents failed to load";
                   }
                }
            });
            alert('second response' + response);
         return response;
    } 
4

2 回答 2

1

以您尝试的方式使用 AJAX 意味着以synchronous阻止浏览器直到传输完成的方法使用它。您可以找到async该功能的配置标志,该标志$.ajax()在设置为时使 AJAX 同步工作,false但我不推荐它(它也已被弃用)。

$.ajax()函数只是向服务器发送一个 HTTP 请求。它不等待立即返回的回复,并继续执行 ajax 函数调用之后的任何指令。

稍后,浏览器 (JavaScript) 会收到来自服务器的 HTTP 响应。您的 ajax 函数调用指定了一个complete/success回调,用于处理 HTTP 响应。但是由于该回调是“稍后”执行的,因此您必须从回调中塑造您的逻辑,而不依赖于返回值。

于 2013-01-11T10:07:33.563 回答
0

你可以这样做:

var myDocuments;

getDocs(); //call getDocs() instead of loadDocuments() in your coding logic

function loadDocuments(response){
        myDocuments = response;
        alert(myDocuments);
    }

    function getDocs() {            
            var myURL = "someURL";
            var response;
            $.ajax({
                url: myURL,
                type: 'GET',
                dataType: 'json',
                 complete: function(docData) {
                   if(docData.status==200){
                       response = parseDocResults(docData.responseText);
                       alert('first response' + response);                                                   
                   }else{
                       response = "Documents failed to load";
                   }

                   loadDocuments(response);
                }
            });            
    } 
于 2013-01-11T10:11:56.810 回答