Câu trả lời được đánh dấu là chính xác không phù hợp với tôi và thực sự là sai. Đó là một loại hack và không nên được coi là câu trả lời đúng. Cùng một cách bạn có thể thực thi mã của bạn bên trong setTimeout (function() {..}, 1000). Nó thậm chí còn đáng tin cậy hơn khi bạn có thể đặt độ trễ: -/
Trong trường hợp của tôi, tôi cần phải đợi cho tất cả các thành phần được xử lý để biết thứ nguyên thực tế của chúng. Khi chúng không được xây dựng, xử lý và thực hiện, các con số không chính xác.
CẬP NHẬT. Đây là câu trả lời đúng:
Hầu hết bạn có thể lấy dữ liệu để xây dựng DOM bằng cách sử dụng một số cuộc gọi không đồng bộ như d3.json() và đó là lý do tại sao phải mất một thời gian. Khi cuộc gọi không đồng bộ là không chặn, sau đó mã tiếp theo của bạn được gọi ngay cả trước khi cuộc gọi async kết thúc, gây ra sự cố và đây là lý do tại sao bạn đăng câu hỏi này.
Vì vậy, bạn đang cố gắng giải quyết điều này bằng cách tìm kiếm thứ gì đó trong D3 hoặc bất cứ nơi nào khác, điều đó sẽ cho bạn biết rằng cuộc gọi không đồng bộ D3 đã kết thúc và bây giờ bạn có thể làm điều tiếp theo. Một số người đề nghị thực hiện cuộc gọi đồng bộ ajax. Điều này là rất lớn. Cuộc gọi không đồng bộ được tạo thành không đồng bộ.
Điều bạn thực sự cần làm là thay đổi mô hình của mình. Chỉ cần chuyển một cuộc gọi lại đến cuộc gọi async đó và đó là nó!Một cái gì đó như thế:
function thingsToDoWhenDOMisBuilt() {
...
}
function buildDOM(rootNode, error, thingsToDoWhenDOMisBuilt) {
...
// everything is built, so we can do our post-build thing against DOM
if (thingsToDoWhenDOMisBuilt)
thingsToDoWhenDOMisBuilt()
}
d3.json(urlToData, buildDOM) {
if (error)
console.log("oops")
buildDOM(rootNode, thingsToDoWhenDOMisBuilt)
}
Ngoài ra, hãy nhìn vào async.js
sự kiện Binding như gợi ý ở trên cũng là một ý tưởng khủng khiếp. Bạn nên sử dụng .enter() .exit() để thay thế. D3 là dữ liệu điều khiển, nếu bạn cần sự kiện điều khiển dòng chảy, sau đó chỉ cần sử dụng jQuery hoặc vanilla JS!
Rực rỡ, cảm ơn bạn. Rõ ràng, tôi đã ở vùng đất jQuery quá lâu rồi. – Roshambo
Đây là thực hành không tốt, và tại sao có rất nhiều biến thể onready trong jQuery và các đối thủ cạnh tranh của nó. – ijw
ilw là đúng. Trên một số WebView trên thiết bị di động nhất định, nó sẽ báo cáo kích thước chiều rộng màn hình không chính xác đôi khi khi mở một ứng dụng. Đang chờ tài liệu sẵn sàng tránh điều đó. – phreakhead