在AJAX中如何从onreadystatechange = function()内部检索变量

时间:2008-11-14 14:25:58

标签: javascript ajax

是否可以从函数外部检索onreadystatechange函数中的变量集?
- 编辑 -
关于职能的执行:
如果可能的话我只想点击一下执行ajaxFunction()  然后弹出()下一次单击,或 不知何故等待ajax功能结束然后调用警报框


在伪代码中:

function ajaxFunction(){
    //creating AJAX 
    ...
    // Create a function that will receive data sent from the server
    ajaxRequest.onreadystatechange = function (){
        if(ajaxRequest.readyState == 4){
            //success code
            ======>Here i want to set variable <=====
            var MyVariable='MyContent';
        }
    }
    //Retrieving page
    ....
}

function popup(){
    ajaxFunction();
    alert(MyVariable);
}

6 个答案:

答案 0 :(得分:5)

以下代码假定ajax-request是同步的:

function popup(){
    ajaxFunction();
    alert(MyVariable);
}

但是由于同步请求阻止了浏览器,因此几乎在所有情况下都应该使用异步调用(如果我没记错的话,不应该在同步请求上调用onreadystatechange,但不同浏览器的行为方式不同)

你能做的是:

function ajaxFunction(callback){
    //creating AJAX 
     ...
    // Create a function that will receive data sent from the server
    ajaxRequest.onreadystatechange = function (){
        if(ajaxRequest.readyState == 4){
            //success code
            callback('MyContent')
        }
    }
    //Retrieving page
     ....
}

function popup() {
  ajaxFunction(function(MyVariable){alert(MyVariable););
}

答案 1 :(得分:1)

有些评论是正确的......这与变量范围无关,而且与设置MyVariable值的内部函数('onreadystatechange'函数)的时间有关的事实都不会被时间执行alert()发生...因此警报将始终为空。

内部函数不是同步执行(即,立即执行),而是在请求返回后延迟并执行,这是在执行alert()之后很久。 唯一的解决方案是将警报推迟到请求完成之后。

但无论如何,内部函数可以将变量设置在其范围之外,正如其他帖子所提到的那样。但是你的问题更多的是关于执行顺序而不是变量范围。

答案 2 :(得分:0)

为什么不将MyVariable的范围更改为函数外部?

var MyVariable;    
function ajaxFunction(){
    //creating AJAX 
     ...
    // Create a function that will receive data sent from the server
    ajaxRequest.onreadystatechange = function (){
        if(ajaxRequest.readyState == 4){
            //success code
            ======>Here i want to set variable <=====
            MyVariable='MyContent';
        }
    }
    //Retrieving page
     ....
}

function popup(){
    ajaxFunction();
    alert(MyVariable);
}

答案 3 :(得分:0)

不,因为MyVariable的范围是函数。要使popup()可见,它必须在事件处理函数和popup()都可以看到的范围内,如Jenp建议的那样。

答案 4 :(得分:0)

将变量传递给popup()函数:

var MyVariable;    
function ajaxFunction(){
    //creating AJAX 
     ...
    // Create a function that will receive data sent from the server
    ajaxRequest.onreadystatechange = function (){
        if(ajaxRequest.readyState == 4){
            //success code
            ======>Here i want to set variable <=====
            MyVariable='MyContent';
            popup(MyVariable);
        }
    }
    //Retrieving page
     ....
}

function popup(x){
    ajaxFunction();
    alert(x);
}

答案 5 :(得分:0)

这可能会使您的问题变得复杂,因此可以随意插入,但使用第三方Javascript库可能会有助于轻微减轻您的负担(正如评论者一些提到的那样)。 Prototype和JQuery都有处理范围的方法,例如Prototype中的bind函数。此外,您不必编写自己的Ajax请求代码,尽管我建议您深入挖掘并了解它是如何工作的!原型类可以帮助解决您所描述的范围问题。您可能希望重构以便使用异步Ajax请求,以便浏览器不必像您编写它的方式那样等待。以下将弹出警报消息并相应地设置变量,尽管我没有测试它是否有错误。它显示了基本概念。

var TestClass = Class.create();
TestClass.prototype = {

    MyVariable: null,
    AjaxURL: "http://yourajaxurl.com/something.asmx",
    DoAjaxCall: function() {
          new Ajax.Request(this.AjaxURL, 
              method: 'get', 
              onSuccess: this.AjaxCallback.bind(this),
              onFailure: this.DoSomethingSmart.bind(this));
    },

    AjaxCallback: function(returnVal) {
          this.MyVariable = returnVal.responseText;   //ResponseText or whatever you need from the request...
          this.Popup(this.MyVariable);
    },

    DoSomethingSmart: function() {
          //Something smart
    },

    Popup: function(message) {
          alert(message);
    }

};

var TestClassInstance = new TestClass();
TestClassInstance.DoAjaxCall();