javascript - RequireJS 模块中的 XMLHttpRequest()
问题描述
全部。我正在开发一个基于浏览器的 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"]
}
});
游戏.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();
});
};
});
解决方案
推荐阅读
- azure-language-understanding - 在语言理解门户中禁用 LUIS 资源键
- c# - 如何从对象数组中获取键值对
- python - 使用 matplotlib 编写两个或三个 x 刻度标签,以 UT 和 MLT(磁本地时间)显示小时
- c++ - 不能包含 mainwindow.h
- android - 调用 Vidyo Connection disable() 函数时应用程序崩溃
- javascript - 有什么方法可以优化这个反应应用程序,可能呈现数百万个组件
- c++ - 乘以 std::complex
通过模板化运算符重载加倍 - asp.net-core - 最大索赔数量
- java - 将在同步语句之前在另一个同步诺克之前?
- bit-manipulation - 给定并行中多个整数的索引,AVX或其他可以提取特定位的设置指令?