2010-02-01 32 views
45

Tôi phải làm điều gì đó rất đơn giản, nhưng dường như không có cách nào dễ dàng để làm điều này, theo như tôi có thể nói. Tôi chỉ muốn tải dữ liệu JSON từ một nguồn từ xa và lưu nó trong một biến Javascript toàn cầu bằng cách sử dụng jQuery. Dưới đây là những gì tôi có:tải json vào biến

var my_json; 
$.getJSON(my_url, function(json) { 
    var my_json = json; 
}); 

Biến my_json vẫn chưa được xác định. Tôi nghĩ rằng đây rõ ràng là một vấn đề phạm vi. Dường như với tôi phương thức $ .getJSON sẽ trả về JSON, nhưng nó trả về một đối tượng XMLHttpRequest. Nếu tôi làm điều này:

request = $.getJSON(my_url); 
my_json = request.responseText.evalJSON(); 

Điều đó không hiệu quả vì cho đến khi nguyên tắc == 4, câu trả lời vẫn giữ nguyên. Có vẻ như bạn phải sử dụng hàm gọi lại để trả về responsetext, vì nó phát sinh thành công.

Không khó như thế này! Đúng?

Trả lời

115

này sẽ làm điều đó:

var json = (function() { 
    var json = null; 
    $.ajax({ 
     'async': false, 
     'global': false, 
     'url': my_url, 
     'dataType': "json", 
     'success': function (data) { 
      json = data; 
     } 
    }); 
    return json; 
})(); 

Vấn đề chính là rằng $.getJSON sẽ chạy không đồng bộ, do đó Javascript của bạn sẽ tiến triển qua các biểu hiện mà gọi nó thậm chí trước success các lần gọi lại, do đó, không có gì đảm bảo rằng biến của bạn sẽ thu thập bất kỳ dữ liệu nào.

Lưu ý cụ thể tùy chọn 'async': false trong cuộc gọi ajax ở trên. Các manual nói:

Theo mặc định, tất cả các yêu cầu được gửi không đồng bộ (ví dụ này được thiết lập là true theo mặc định). Nếu bạn cần các yêu cầu đồng bộ, hãy đặt tùy chọn này thành false. Lưu ý rằng các yêu cầu đồng bộ có thể tạm thời khóa trình duyệt, tắt bất kỳ hành động nào trong khi yêu cầu đang hoạt động.

+0

chỉ để làm rõ cho lợi ích của tôi: $ .getJSON không bao giờ là một lựa chọn tốt cho các yêu cầu phong cách đồng bộ, ngay cả khi tôi trả lại dữ liệu cho biến của tôi trong khi gọi lại thành công? – user1026169

+0

+1 cho thông tin liên quan nhưng tại sao bạn tạo biến json null ở đầu hàm. – Manoj

+0

@Manoj Có 2 lý do [1] khối này có thể nằm trong một phương thức và được gọi nhiều lần. Vì vậy, điều này sẽ làm mới biến json. Nhưng nếu yêu cầu ajax sẽ cập nhật điều này dù sao điểm là gì? Vâng thats bởi vì ... [2] đây là một quy ước mã hóa trong trường hợp yêu cầu ajax thất bại, sau đó người dùng có thể kiểm tra xem json là null. Nếu có, thì có thể giả định yêu cầu ajax không thành công –

25

bit mã nên đọc:

var my_json; 
$.getJSON(my_url, function(json) { 
    my_json = json; 
}); 
+5

+1 không sử dụng 'var' hai lần –

+3

cách thực hiện điều này tránh được những vấn đề không đồng bộ nêu trên? – user1026169

+1

Hầu hết có thể cố gắng để buộc cuộc gọi ajax đồng bộ là một ý tưởng tồi, ajax có nghĩa là cho các cuộc gọi không đồng bộ. Câu trả lời này phải là giải pháp mong muốn cho một vấn đề được mô tả trong câu hỏi, +1 từ tôi. – Buyuk

0
<input class="pull-right" id="currSpecID" name="currSpecID" value=""> 

    $.get("http://localhost:8080/HIS_API/rest/MriSpecimen/getMaxSpecimenID", function(data, status){ 
     alert("Data: " + data + "\nStatus: " + status); 
    $("#currSpecID").val(data); 
    }); 

enter image description here enter image description here

0

var itens = null; 
 
$.getJSON("yourfile.json", function(data) { 
 
    itens = data; 
 
    itens.forEach(function(item) { 
 
    console.log(item); 
 
    }); 
 
}); 
 
console.log(itens);
<html> 
 
<head> 
 
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script> 
 
</head> 
 
<body> 
 
</body> 
 
</html>

+2

Chào mừng bạn đến ngăn xếp tràn :-) Câu trả lời chỉ có mã không hữu ích cho cộng đồng. Vui lòng giải thích tại sao mã của bạn giải quyết được vấn đề. – JimHawkins

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