jquery中不同位置的相同变量的不同值

时间:2013-12-25 12:51:19

标签: javascript jquery

我正在学习jquery我试图通过ajax获取一些数据。
这是代码

$(function () {
     var allProductsData;
     var gotProducts = new Array();
     var productsWithDelete = new Array();
     $('.addProducts').on('keyup', function (event) {
         var searchVal = $(this).val().trim();
         if (searchVal.length > 0) {
             $.ajax({
                 url: 'http://localhost/exhibition/admin/default/searchProducts',
                 data: {
                     products: $(this).val(),
                 },
                 type: 'POST',
                 dataType: 'html',
                 success: function (msg) {
                     allProductsData = msg;
                     alert(allProductsData); //No. 1 
                 }
             });
             alert(allProductsData); //No. 2
         }
         alert(allProductsData); // No. 3
     });
 });

我从服务器返回的值是1。如您所见,我已将该值存储在全局变量allProductsData中。但是当我尝试在3个不同的地方(No 1,No 2,No 3)提醒 allProductsData 时。然后我得到不同的值,即
1 No 1 //这是正确的 在第2号未定义 //这是不正确的 在3号时 1 //再次正确

问题

为什么我在那里得到未定义的值?

2 个答案:

答案 0 :(得分:4)

AJAX中的A代表异步,因此您无法对正常的同步调用进行操作。在收到来自服务器的响应后调用警报No 1.,它可能(但也可能不会)在警报No 2.之前调用。然后,调用No 2.并且不保证它已经从ajax调用中分配了值。 我认为No 3.具有正确价值,因为在致电No 1.No 2.后,您的服务器设法以正确的价值回复您。

为了获得始终正确的值,请在成功函数回调中操作响应。

答案 1 :(得分:1)

您唯一可以确定allProductsData定义的地方是success回调。一旦发送了呼叫,就会评估ajax呼叫之后的代码,而不是在收到响应时。

您应该将函数中需要allProductsData的所有代码放入success回调中的调用中。否则,您永远无法确定allProductsData是否已定义。