javascript在for循环中执行嵌套的ajax调用

时间:2017-10-25 00:05:16

标签: javascript jquery ajax asynchronous

所以,我有两个代码片段 - 它们都执行没有错误。两者都是为了做同样的事情 - 遍历一个单词列表并查找这些单词出现在(SOLR)中的文档,然后从每个文档中拉出这些单词出现的段落。然而,他们没有返回所需的结果。第一个跳过嵌套的ajax调用(每个循环内部的一个调用),如果完全运行ajax调用,它就在主(父)循环已经完成之后。第二个只有在那里有警报时才能正常工作。如果用户确认警报,则第二个循环正确执行。没有警报,第二个循环将被跳过。任何人都可以对这里的错误有所了解。我已经尝试了ajax {完成:...}和ajax {}。已完成,但他们也没有工作。 这是第一个片段:



for (var m = 0; m < definitions.length; m++ ) {
 var url = pathtomyfile;
 var doctitle, docname, docs;
 var htmlBody, pHtml, fullHTML;

 $.ajax({
  url: url,
  async: false,
  dataType: 'json',
  success: function (result){
   docs = result.response.docs;
  },
  complete: function () {
   $(docs).each (function (){
    var doctitle = this.dc_title_str.toString().replace (/(\.html|\.htm)/, '');
    var docname = filePathToUrl (this.resourcename.toString ());
    var url = decodeURIComponent (docname);
    $.ajax({
     url: url,
     async: false,
     dataType: 'html',
     success: function (resp){
      fullHTML = resp.toString();
      htmlBody = fullHTML.split (/<body>/)[1].split (/<\/body>/)[0];
      htmlBody = htmlBody.replace (/\s/g, " ").replace (/&nbsp;/g, " ").replace (/(<a id="x\d+?")\/>/g, "$1></a>");
      var pHtml = $(htmlBody).find("#id").parent();
      pHtml = $(pHtml).wrap('<p/>').parent().html();
      pHtml = pHtml.replace (/\<a id/g, "#s#").replace (/<\/a>/g, "#e#").replace (new RegExp ("\\b(" + en_word.replace (/\s/g, "(<[^<]+?>| )*")+"(s|ed|ing|es)*)\\b", "ig"), "<span style='background-color:yellow'>$1</span>").replace (/#s#/g, "<a id").replace (/#e#/g, "<\/a>");
      hsnip += "<p><b><i>From " + doctitle + ":</i></b></p> " + pHtml;
     }
    });
   })
  }
 });
}
&#13;
&#13;
&#13;

这是第二个片段:

&#13;
&#13;
for (var m = 0; m < definitions.length; m++ ) {
 var url = pathtomyfile;
 var doctitle, docname, docs;
 var htmlBody, pHtml, fullHTML;
 $.ajax({
  url: url,
  async: false,
  dataType: 'json',
  success: function (result){
   docs = result.response.docs;
  }
 });
 alert ('ok');
 for (var b = 0; b < docs.length; b ++) {
  doctitle = docs[b].dc_title_str.toString().replace (/(\.html|\.htm)/, '');
  docname = filePathToUrl (docs[b].resourcename.toString ());
  
  var rawFile = new XMLHttpRequest ();

  docname = decodeURIComponent (docname);

  rawFile.open ("GET", docname, false);
  rawFile.onreadystatechange = function () {
   if (rawFile.readyState === 4 && (rawFile.status === 200 || rawFile.status === 0)) {
    fullHTML = rawFile.responseText.toString();
    htmlBody = fullHTML.split (/<body>/)[1].split (/<\/body>/)[0];

    var pHtml = $(htmlBody).find("#id").parent();

    pHtml = $(pHtml).wrap('<p/>').parent().html();
    hsnip += "<p><b><i>From " + doctitle + ":</i></b></p> " + pHtml;
   }
  }
  rawFile.send (null);
 }
}
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

这听起来像一个异步问题,不是最好的想法在循环中进行AJAX调用,你可以复制一个带递归的循环,让函数只进行一次调用,并在每次调用完成后再次调用该函数,并使用if检查是否已完成添加断点。