2011-01-21 43 views
14

Tôi đang cố gắng lấy kết quả của một yêu cầu ajax để đặt trong một biến mà tôi có thể truy cập bên ngoài yêu cầu đó. Tôi đã thử điều này JQuery - Storing ajax response into global variable nhưng biến của tôi beer vẫn không xác định bên ngoài các chức năng $.getJSON$.ajax (Tôi đã thử cả hai).Jquery - Lưu trữ phản hồi Ajax jSON dưới dạng biến

Đây là mã của tôi và nơi tôi có thể xem kết quả từ số console.log(beer).

var beer; 
$.getJSON(jsonUrl, function (json) { 
    beer = json; 
    console.log(beer); // returns beer 
}); 
console.log(beer); // returns undefined 

var beer = (function() { 
    var result; 

    $.ajax({ 
     url: jsonUrl, 
     success: function (data) { 
      result = data; 
      console.log(beer); // returns beer 

     } 
    }); 
    console.log(result); // returns undefined 
    if (result) return result; 
})(); 
console.log(beer); // returns undefined 

Trả lời

17

Đó là một yêu cầu không đồng bộ, vì vậy nó được kích hoạt, nhưng tập lệnh của bạn không chờ đợi phản hồi trước khi nó tiếp tục. Nếu bạn cần phải chờ đợi vào một yêu cầu ajax để kết thúc, hãy thử một cái gì đó như thế này:

var beer; 
$.getJSON(jsonUrl,function(json){ 
    beer = json; 
    checkDrink();     
});   

function checkDrink() { 
    console.log(beer); 
} 
+1

Vậy làm cách nào để tôi có thể truy cập bia sau này trong tập lệnh từ bên ngoài chức năng? – Sebastien

+1

Bất kỳ điều gì phụ thuộc vào kết quả của yêu cầu JSON đó phải nằm trong hàm riêng biệt đó. – chprpipr

+0

Và tại sao nó không hoạt động? \t \t \t \t bia = $ .ajax ({ \t \t \t \t \t url: jsonUrl, \t \t \t \t \t thành công: function (data) { \t \t \t \t \t \t dữ liệu trở lại; \t \t \t \t \t} \t \t \t}); – Sebastien

0

Sự cố là bạn đang cố gắng truy cập dữ liệu trước khi thực sự quay lại từ máy chủ, chức năng 'thành công' thực sự là gọi lại được gọi khi cuộc gọi ajax kết thúc thành công. Các $ .ajax (hoặc $ .get) chức năng trở inmediatly ...

Bạn sẽ cần phải bằng cách nào đó báo hiệu cho các chức năng quan tâm mà bạn nhận được dữ liệu vào 'bia' var bên trong gọi lại thành công của bạn

1

Suggest vào mã bên dưới:

var beer = $.ajax({ 
    url: jsonUrl, 
    async: false, 
    dataType: 'json' 
}).responseJSON; 

Những khoảnh khắc then chốt là:

  1. thiết async để sai, để trả lại kết quả dưới dạng biến, không gọi lại thành công gọi lại không đồng bộ
  2. đặt dataType thành json để phân tích cú pháp phản hồi của máy chủ ing as json
Các vấn đề liên quan