首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >异步代码返回错误变量的问题

异步代码返回错误变量的问题
EN

Stack Overflow用户
提问于 2019-10-20 01:48:35
回答 1查看 15关注 0票数 0

我是使用AJAX编码的新手,不明白为什么下面使用回调的异步函数不能正常工作。变量PC是全局变量,用于测试时设置为PC = 666。应为PC分配从XML文件读取的值1。我使用的代码如下所示。

代码语言:javascript
运行
复制
function makePlaceRequest(XMLaddress, callback) {
        httpRequest = new XMLHttpRequest();
        // alert('Starting XML read');
        if (!httpRequest) {
            alert('Warning :( Cannot create an XMLHTTP instance');
            return false;
        }

        // httpRequest.onreadystatechange = getPlace;

        // State changes

        httpRequest.onreadystatechange = function() {
            try {
                if (httpRequest.readyState === XMLHttpRequest.DONE) {
                    if (httpRequest.status === 200) {
                        var xmldoc = httpRequest.responseXML;
                        var root_node = xmldoc.getElementsByTagName('placecode').item(0);
                        PC = root_node.firstChild.data;
                        // callback();
                    }
                    else {
                        alert('There was a problem with the request.');
                    }
                }
            }
            catch( e ) {
                alert('Caught Exception: ' + e.description);
            }
        }

        httpRequest.open('GET', XMLaddress);
        // httpRequest.open('GET', '/xml/Places.xml');
        httpRequest.send();

        callback();
    }

    makePlaceRequest('/xml/Places.xml', function() {
        alert(PC);
        alert('Completed XML read');
        alert(PC);
    });

我按如下方式调用该函数:makePlaceRequest('/xml/Places.xml');第一个( PC )警报显示666,即,在成功读取XML文件之前调用回调,并且第二个PC警报显示正确的值,即,我假定后者的发生是由于info消息引入的延迟(完成的XML读取)。我不明白为什么在处理完成之前调用回调函数。

EN

回答 1

Stack Overflow用户

发布于 2019-10-20 02:25:24

对httpRequest.send()的调用是异步的,因此不会等待AJAX调用完成。因此,在AJAX调用收到响应并处理该响应之前,很可能会调用callback()。

当接收到响应时,程序流将被中断以运行onreadystatechange处理程序。当onreadystatechange处理程序完成运行时,中断的程序流继续运行。

onreadystatechange处理程序中注释掉的callback()将确保仅在接收和处理响应后才调用callback()。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58466424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档