все.Я работаю над браузерной RPG для развлечения и обучения программированию.Недавно я выучил RequireJS, что удивительно, но во время пересмотра моего кода для AMD я столкнулся с ошибкой приложения.
В своей первоначальной реализации я использовал запрос XMLHttpRequest()
, чтобы выбрать игрокагерой с моего сервера через GET
вызов файла GetHero.php
.Asynchronous
вызовы отличные, но я боролся с выбором времени функции обратного вызова и продолжением игры, т. Е. Игра продолжается до обратного вызова, что приводит к ошибке.
Мои вопросы: 1) Какможно заставить игру ждать, пока XMLHttpRequest () вернет значение, прежде чем перейти к следующему блоку кода?2) Когда в моем RequireJS AMD я должен выполнить эту функцию?
Я попытался отключить асинхронный в функции .open()
, но так как RequireJS использует аналогичные вызовы, я не думаю, что это работает так, как всинхронное выполнение моего кода.Я также опустил большую часть кода, чтобы изолировать конкретную проблему и повысить удобочитаемость.
Заранее спасибо всем, кто хочет помочь мне понять это!
main.js
require.config({
baseUrl: "assets/js",
deps: ["game"],
paths: {
jquery: "lib/jquery-3.3.1.min",
bootstrap: "lib/bootstrap.min",
game: "game",
hero: "models/hero",
getHero: "models/getHero",
stats: "models/stats",
heroClasses: "models/heroClasses"
},
shim: {
bootstrap: ["jquery"]
}
});
game.js
define(["hero", "bootstrap"], function (h) {
Hero = h;
console.log(Hero);
console.log(Hero.Stats.Get("str"));
console.log(Hero.Stats.GetInfo()); // <==== this fails
});
hero.js
define(["stats"], function (s) {
Stats = s;
return {
Stats: Stats
};
});
stats.js
define(["getHero"], function(myHero) {
var Info = myHero; // returns hero obj "{ name: "Hero", level: 1, etc..}"
var _HeroClasses = heroClasses;
var _GetInfo = function (arr) {
return Info;
};
return {
GetInfo: _GetInfo
};
});
getHero.js
define([], function () {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var myObj = JSON.parse(this.responseText);
return myObj;
}
};
xmlhttp.open("GET", "/game/assets/php/GetHero.php", false);
xmlhttp.send();
});
GetHero.php
<?php
// TODO create MYSQL call to load hero
echo '{ "id": 0, "name": "Ryan", "classId": 0, "level": 50, "exp": 251 }';
?>
Обновленный код: (работает, но, скорее всего, уродливое / плохое решение)
- game.js (обновлено)
var a = new Promise(function (resolve, reject) {
document.getElementById("message").innerHTML = "Loading...";
Hero = h;
resolve(true);
});
a.then(function() {
Hero.Stats.GetInfo();
document.getElementById("message").innerHTML = "Ready";
})
.catch(function(err) {
console.error('There was an error 2!', err.statusText);
});
- getHero.js (Обновлено)
define([], function () {
return function (method, url) {
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.open(method, url);
xhr.onload = function () {
if (this.status >= 200 && this.status < 300) {
resolve(xhr.response);
} else {
reject({
status: this.status,
statusText: xhr.statusText
});
}
};
xhr.onerror = function () {
reject({
status: this.status,
statusText: xhr.statusText
});
};
xhr.send();
});
};
});