2012-03-28 101 views
0

所以我有这个javascript函数,它发送一个ajax请求来从php变量中获取一个值。将获取的数据从ajax调用返回到另一个函数

函数看起来像这样:

function get_cart_limit() { 
$.ajax({ 
    url: '/w2w/ajax/', 
    data: { 
     _action: 'get_cart_limit' 
    }, 
    type: 'post', 
    timeout: 10000, 
    success: function(output) { 
     var cartlimit = output; 
        alert(cartlimit); // this gives me the correct value. 
     return cartlimit; 
    }, 
    error: function(output){ 

    } 
}); 

}

当我从另一个调用函数这个函数是这样的:

var cartlimit = get_cart_limit(); 

我的变量 “cartlimit” 是不确定的。

所以ajax调用正在工作,但为什么我不能将值返回到另一个函数? 对我来说早,我的大脑不能正常工作! :)

干杯!

+0

由于ajax调用是异步的,所以您的变量未定义是正常的。 – denolk 2012-03-28 06:51:49

回答

1

如果更改cartlimit变量的范围和禁用异步请求,get_cart_limit()应返回正确的值

function get_cart_limit() { 
var cartlimit; 
$.ajax({ 
    url: '/w2w/ajax/', 
    data: { 
     _action: 'get_cart_limit' 
    }, 
    type: 'post', 
    timeout: 10000, 
    async: false, 
    success: function(output) { 
     cartlimit = output; 

    }, 
    error: function(output){ 
    } 
}); 
return cartlimit; 
} 
+0

谢谢!这工作就像一个魅力!干杯! – ninja 2012-03-28 07:06:23

+1

是的,这是有效的,但你会锁定浏览器,直到请求完成。 – NeXuS 2012-03-28 10:16:50

0

声明这个cartlimit具有全局范围。 Decalre此功能启动

var cartlimit; 
function get_cart_limit() { 
$.ajax({ 
................... 

之前在这里您cartlimit将被宣布后,才AJAX功能获得成功。

但是在执行此成功之前可能会执行其他脚本。所以它会得到不确定的

0

你可以在你的输出数据传递给指定的函数这样

var cartlimit = get_cart_limit(output); 
1

变量cart_limit仅在AJAX请求成功终止后才会设置。

为什么?

  1. 的AJAX调用是异步的,即get_cart_limit()结束实际的答案来自服务器
  2. 您指定为success: function(output) { /*...*/ }被调用时,答案来自于服务器返回的匿名函数回来。

如果您在执行成功函数之前调用另一个试图访问cart_limit的函数,将会得到一个未定义的值。

即使您在success函数中执行return语句,它与get_cart_limit()函数不同,它会在不同的时间执行,因此您无法获得将返回值分配给任何变量的所需效果。

一个解决这个问题是有需要cart_limit由匿名成功函数被调用的函数。

function get_cart_limit() { 
    $.ajax({ 
     url: '/w2w/ajax/', 
     data: { 
      _action: 'get_cart_limit' 
     }, 
     type: 'post', 
     timeout: 10000, 
     success: function(output) { 
      var cartlimit = output; 
      alert(cartlimit); // this gives me the correct value.     
      function_that_needs_cart_limit(); 
     }, 
     error: function(output){ 
     } 
    }); 
}