2013-03-07 29 views
9

Khi trang web của tôi khởi tạo lần đầu tiên, nó truy vấn một máy chủ để lấy lại một số dữ liệu. Tôi không thể đặt bất kỳ thứ gì trên trang cho đến khi dữ liệu này được trả về. Với d3.js, tôi có thể sử dụng d3.json() để lấy dữ liệu của mình, nhưng vì nó không đồng bộ, tôi cần phải đặt toàn bộ logic trang trong hàm gọi lại. Tôi làm cách nào để yêu cầu dữ liệu và đợi nó quay lại?Làm cách nào để tải dữ liệu JSON một cách đồng bộ với d3.js?

Trả lời

4

Về cơ bản, bạn đang thực hiện nó theo cách duy nhất. Hàm gọi lại phải là hàm bắt đầu phần còn lại của mã của bạn. Tuy nhiên, bạn không cần tất cả mã của mình trong hàm gọi lại, bạn có thể giới thiệu tính không giới hạn. Vì vậy, chức năng gọi lại sẽ gọi một chức năng khác bên trong mà sẽ là những gì hiện đang trong chức năng gọi lại của bạn.

4

Sử dụng yêu cầu đồng bộ trong JavaScript không được khuyến nghị vì nó chặn toàn bộ chuỗi và không có gì được thực hiện trong thời gian chờ đợi. Người dùng cũng không thể tương tác tốt với trang web.

Nếu nó thực sự những gì bạn muốn, bạn có thể làm như sau (sử dụng jQuery):

var jsonData; 
jQuery.ajax({ 
    dataType: "json", 
    url: "jsondatafile.json", 
    async: false 
    success: function(data){jsonData = data} 
}); 

Tuy nhiên nó không được khuyến khích, thậm chí bởi jQuery, như đã giải thích ở đây jQuery.ajax() documentation:

Chữ cái đầu tiên trong Ajax là viết tắt của "không đồng bộ", có nghĩa là hoạt động xảy ra song song và thứ tự hoàn thành không được đảm bảo. Tùy chọn async để $ .ajax() mặc định là true, cho biết rằng việc thực thi mã có thể tiếp tục sau khi yêu cầu được thực hiện. Đặt tùy chọn này thành false (và do đó làm cho cuộc gọi không còn không đồng bộ) được khuyến khích mạnh mẽ, vì nó có thể khiến trình duyệt không phản hồi.

Lưu ý cuối cùng, tôi không thấy điều gì ngăn bạn sử dụng bất kỳ chức năng nào trong thuộc tính success theo cách không đồng bộ. Hầu hết các lần thay đổi thiết kế của bạn để sử dụng các yêu cầu không đồng bộ sẽ đáng giá. Theo kinh nghiệm, gỡ lỗi một trang sử dụng các yêu cầu đồng bộ là một nỗi đau (đặc biệt là khi các yêu cầu không được trả lời ...).

+0

Người dùng đang hỏi về d3, chứ không phải jQuery – EdgeCaseBerg

+2

Cảm ơn phản hồi. Những gì OP yêu cầu là làm thế nào để thực hiện một yêu cầu đồng bộ, nó không thể làm điều này bằng cách sử dụng API D3 vì nó không phải là cách mọi thứ nên được thực hiện. Câu trả lời của tôi cung cấp một cách để làm điều này bằng cách sử dụng jQuery với một tuyên bố từ chối trách nhiệm lớn nói rằng nó không được khuyến cáo. Tôi đã chỉnh sửa câu trả lời của mình để làm cho nó rõ ràng hơn nó sử dụng jQuery và rằng nó không nên được thực hiện trong trường hợp chung. –

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