Tôi có tình huống tương tự trong trò chơi được xây dựng với Three.js và Google Closure. Tôi phải tải 2 tài nguyên, ba và đóng cửa không cho phép tôi thực hiện những đồng bộ này.
Ban đầu tôi ngây thơ đã viết như sau:
main() {
...
var loaded=0;
...
// Load Three geometry
var loader = new THREE.JSONLoader();
loader.load("x/data.three.json", function(geometry) {
...
loaded++;
});
// Load my engine data
goog.net.XhrIo.send("x/data.engine.json", function(e) {
var obj = e.target.getResponseJson();
...
loaded++;
});
// Wait for callbacks to complete
while(loaded<2) {}
// Initiate an animation loop
...
};
Các vòng lặp mà chờ đợi cho callbacks để hoàn thành không bao giờ kết thúc, từ quan điểm của vòng lặp loaded
không bao giờ có được tăng lên. Vấn đề là các cuộc gọi lại không được kích hoạt cho đến khi main
trả về (ít nhất là trên Chrome).
Một giải pháp có thể là có cả hai cuộc gọi lại kiểm tra xem đó có phải là lần cuối cùng hoàn thành và họ tiếp tục bắt đầu vòng lặp hoạt ảnh hay không.
Một giải pháp - có lẽ là một câu trả lời trực tiếp hơn với những gì bạn đang yêu cầu (làm thế nào để chờ đợi cho mỗi tải trước khi bắt đầu khác) - sẽ được tổ callbacks như sau:
// Load Three geometry
var loader = new THREE.JSONLoader();
loader.load("x/data.three.json", function(geometry) {
...
// Load my engine data
goog.net.XhrIo.send("x/data.engine.json", function(e) {
var obj = e.target.getResponseJson();
...
// Initiate an animation loop
...
});
});
};
Nguồn
2011-12-30 14:58:16
Tôi thực sự muốn mọi người sẽ để lại ý kiến giải thích khi họ -1. – kojiro