2013-04-03 32 views
6

Tôi có một mã ajax jquery như sau:Jquery .ajax() biến địa phương không thể gán cho toàn cầu

$(document).ready(function() { 
    var global_arr = new Array(); 
    $.ajax({ 
    url: 'result.php', 
    type: 'post', 
    dataType: 'json', 
    success: function(data) { 
     $.each(data, function(key, value) { 
      global_arr.push(value.name); 
     }); 
     alert(global_arr); //get correct value, works fine 
    } 
    }); //end of ajax function 
    alert(global_arr); //get null, it doesn't work properly 
}); 

Chú ý các đường để cảnh báo global_arr, tại sao tôi không thể nhận được các giá trị trên $ .ajax() chức năng? Cảm ơn bất kỳ ai giúp đỡ về điều này.

+0

Câu hỏi yêu thích của chúng tôi, các cuộc gọi không đồng bộ! – epascarello

Trả lời

6

Ajax mất nhiều thời gian để hoàn thành. Việc thực thi hàm không mất nhiều thời gian. Vì vậy, do thời gian bạn nhận được để cảnh báo của bạn bên ngoài của yêu cầu ajax, yêu cầu ajax vẫn còn sử dụng thời gian để hoàn thành (hoặc trong truyền tải hoặc trong hành động phía máy chủ).

Bạn luôn có thể đợi phương thức ajax hoàn tất.

$(document).ready(function() { 

var global_arr = new Array(); 
var complete = false;//flag to wait for ajax completion 
$.ajax({ 
    url: 'result.php', 
    type: 'post', 
    dataType: 'json', 
    success: function(data) { 
    $.each(data, function(key, value) { 
     global_arr.push(value.name); 
    }); 
    alert(global_arr); //get correct value, works fine 
    complete = true;//mark ajax as complete 
    } 
}); //end of ajax function 

(function runOnComplete(){ 
    if(complete){//run when ajax completes and flag is true 
    alert(global_arr); 
    }else{ 
    setTimeout(runOnComplete,25);//when ajax is not complete then loop 
    } 
})() 
}); 

Tuy nhiên, cách phổ biến nhất là sử dụng gọi lại.

$(document).ready(function() { 

function runOnComplete(){//code executes once ajax request is successful 
    alert(global_arr); 
} 
var global_arr = new Array(); 
$.ajax({ 
    url: 'result.php', 
    type: 'post', 
    dataType: 'json', 
    success: function(data) { 
    $.each(data, function(key, value) { 
    global_arr.push(value.name); 
    }); 
    alert(global_arr); //get correct value, works fine 
    runOnComplete();//callback 
    } 
}); //end of ajax function 
}); 
+0

cũng được thực hiện, cảm ơn! – user2241859

+0

Thú vị. Đã học một chút từ điều này về không đồng bộ, đặc biệt là phương pháp đầu tiên của bạn. Cụ thể là, về cơ bản bạn sẽ đợi phương thức ajax để hoàn thành như thế nào. Cảm ơn. – racl101

5

Ajax không đồng bộ. Vào thời điểm động cơ JS đạt đến đường cảnh báo không hoạt động() của bạn, cuộc gọi AJAX vẫn chưa có cơ hội nhận phản hồi từ máy chủ và thiết lập biến.

Đó là lý do tại sao cảnh báo bên trong() hoạt động. Nó được thực thi khi đáp ứng đến từ máy chủ.

0

đó là bởi vì alert(global_arr); //get null, it doesn't work properly chạy trước $.ajax đã hoàn

0

Đề nghị của tôi đây sẽ là để phá vỡ này ra làm 3 funcitons vì vậy nó sẽ có ý nghĩa hơn một chút. Bạn sẽ cần ajax, handelRequest, onComplete. Bạn cũng có thể muốn thêm và xử lý lỗi vào hàm ajax của mình để nếu nó thất bại, nó có thể làm như vậy với tập lệnh bị khóa trên người dùng.

$(document).ready(function() { 

    var global_arr = new Array(); 

    $.ajax({ 
     url: 'result.php', 
     type: 'post', 
     dataType: 'json', 
     success: handelRequest(data), 
     error: handleError    
    }); 

    function handelRequest(data) {   
     $.each(data, function (key, value) { 
      global_arr.push(value.name); 
     }); 
     onComplete(global_arr); //get correct value, works fine 
    } 

    function onComplete(global_arr){ 
     // then here you can do what ever you 
     // you would like with the array 
     alert(global_arr); 
    } 

    function handleError(){ 
     // gracefully fail 
    } 

}) 
+0

cảm ơn rất nhiều! – user2241859

Các vấn đề liên quan