У меня похожая ситуация в игре, созданной с помощью Three.js и Google Closure. Я должен загрузить 2 ресурса, Три и Закрытие не позволяют мне сделать их синхронными.
Изначально я наивно писал следующее:
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
...
};
Цикл, ожидающий завершения обратных вызовов, никогда не заканчивается, с точки зрения цикла loaded
никогда не увеличивается. Проблема в том, что обратные вызовы не запускаются до тех пор, пока не вернется main
(по крайней мере, в Chrome в любом случае).
Одним из решений может быть проверка обоих обратных вызовов, чтобы увидеть, завершено ли это последним, и они продолжают инициализацию цикла анимации.
Другое решение - возможно, более прямой ответ на то, что вы спрашиваете (как ждать каждой загрузки, прежде чем инициировать другую), - заключаться в следующем:
// 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
...
});
});
};