使用多个XMLHttpRequest加载多个文本文件

时间:2014-04-07 20:33:15

标签: javascript xmlhttprequest

我正在使用JavaScript创建一个疯狂的libs风格的webapp,我试图将几个不同文本文件的行加载到相同数量的不同数组中,并且我遇到了麻烦弄清楚如何让它发挥作用。一切都在服务器上,文本文件也在服务器上。

我只使用一个文本文档,但我不能只使用一个文档作为最终产品,因为我需要4种不同的单词类型,其中每个.txt文件都是一个单词类型的列表。最后,代码在先前确定的位置使用结果数组的值,并将该单词插入到一个句子中(一个名为" generatedidea"的变量)。

有人可以帮我弄清楚如何使这项工作?或者建议一个更好的方法来做到这一点?当我现在运行它时,我得到的是关于文档的每个警报都没有准备好解析两次......

var typesFile = new XMLHttpRequest();
var types = [];
typesFile.open("GET", "values/gametypes.txt", true);
typesFile.onreadystatechange = function()
{
  if (typesFile.readyState === 4) {  // document is ready to parse.
    if (typesFile.status === 200) {  // file is found
      types = typesFile.responseText.split("\n");
    } else alert("gametypes.txt not found");
  } else alert("gametypes.txt not ready to parse");
}
typesFile.send(null);

var nounsFile = new XMLHttpRequest();
var nouns = [];
nounsFile.open("GET", "values/nouns.txt", true);
nounsFile.onreadystatechange = function()
{
  if (nounsFile.readyState === 4) {  // document is ready to parse.
    if (nounsFile.status === 200) {  // file is found
      nouns = nounsFile.responseText.split("\n");
    } else alert("nouns.txt not found");
  } else alert("nouns.txt not ready to parse");
}
nounsFile.send(null);

var verbsFile = new XMLHttpRequest();
var verbs = [];
verbsFile.open("GET", "values/verbs.txt", true);
verbsFile.onreadystatechange = function()
{
  if (verbsFile.readyState === 4) {  // document is ready to parse.
    if (verbsFile.status === 200) {  // file is found
      verbs = verbsFile.responseText.split("\n");
    } else alert("verbs.txt not found");
  } else alert("verbs.txt not ready to parse");
}
verbsFile.send(null);

generatedidea += "A ";
generatedidea += types[gt] + " ";
generatedidea += "game where a ";
if (a1 >= 0) generatedidea += nouns[a1] + " ";
generatedidea += nouns[n1] + " ";
generatedidea += verbs[v1] + " a ";
if (a2 >= 0) generatedidea += nouns[a2] + " ";
generatedidea += nouns[n2];
if (n3 >= 0) {
generatedidea += " while ";
if (a3 >= 0) {generatedidea += nouns[a3] + " ";}
generatedidea += nouns[n3] + " ";
}
if (v2 >= 0) generatedidea += verbs[v2] + " a ";
if (n4 >= 0) {
if (a4 >= 0) {generatedidea += nouns[a4] + " ";}
generatedidea += nouns[n4];
}
generatedidea += ".<br />";

1 个答案:

答案 0 :(得分:0)

你应该记住,JavaScript是异步工作的。因此,在为onreadystatechange定义闭包/函数之后,代码将继续执行。最后像

这样的行

generatedidea + =名词[n1] +&#34; &#34 ;;    generatedidea + =动词[v1] +&#34; a&#34 ;;

在解析由AJAX调用检索的数据之前将执行

(站点说明:您是否正确定义了变量gta1,...?

我建议您使用jQuery及其API for deferred objects。例如:

var ajaxCall1 = $.get("url1", function (data) { /* do parsing here */ });
var ajaxCall2 = $.get("url2", function (data) { /* do parsing here */ });

$.when(ajaxCall1, ajaxCall2, ...).done(function () {
    // every AJAX call is done, do the rest...
});