2013-05-16 165 views
2

以下是我的JavaScript。如何使全局变量为success,以便在ajax-> success中所做的更改反映在外部?访问javascript全局变量

function foo() { 
    var success = false; 
    $.ajax({ 

     type: "POST", 
     url: "", 
     dataType: "xml", 
     success: function(xml) { 
      var code = parseInt($(xml).find("Response").attr("code"), 10); 
      switch (code) { 
       case 1: 
        success = false; 
        break; 
       case 0: 
        success = true; 
        break; 
      } 
     } 
    }); 
    return success; 
} 
+1

我相信如果你在任何函数之外声明它,它是一个全局变量。它会像'window.success'一样! – NINCOMPOOP

+0

不知道你到底想要达到什么,但变量“成功”是正确放置并应该工作。另外,如果你返回“成功”,这意味着你在一个函数中使用它,为该特定函数创建一个私有变量。如果你想使它成为一个全局变量,只需把它放在你的脚本的开始,或者就在这个函数之外。 –

+1

这实际上是JavaScript SO中最常见的问题。它的名字都是:AJAX或** Asynchronous ** JavaScript和XML。 – elclanrs

回答

4

传递被称为在success一个回调函数:

function makeCall(callback) { 
    $.ajax({ 
     type: "POST", 
     url: "", 
     dataType: "xml", 
     success: function(xml) { 
      var code = parseInt($(xml).find("Response").attr("code"), 10); 
      callback(!code); 
     } 
    }); 
} 

makeCall(function (success) { 
    alert(success); 
}); 

这是编程/请求如何异步工作。当然,另一种方法是将其作为一个同步请求,但有点失败的目的。

我压缩了switch的东西,因为你似乎想要相反的布尔值01

0

你以后的做法将无法正常工作。 Ajax调用是异步的。意味着即使在实际的GET被触发之前它也会立即返回。因此,外部变量(可从成功回调中访问,由于闭包而可访问)除了在返回Ajax之前建立的变量之外,没有任何值。相反,您可以通过设置async:false和$ .ajax中的其他值来指定Ajax调用同步触发,或者您可以重构代码以执行任何您想要执行的操作,如果函数将其放入成功回调。

+0

我正在考虑upvoting你,直到我看到你推荐'async:false' –

+0

'async:false'是'ajax'因为'eval'是'string'? – elclanrs

+0

@elclanrs没有。 'eval'只是招致注射攻击,并且速度很慢。 'async:false'是纯粹的邪恶;-) –