繁体   English   中英

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

[英]javascript execute nested ajax call inside a for loop

因此,我有两个代码段-它们都在执行且没有错误。 两者的意思是相同的-遍历单词列表并查找这些单词在(SOLR)中出现的文档,然后从每个文档中拉出出现这些单词的段落。 但是,它们不会返回期望的结果。 第一个跳过嵌套的ajax调用(for每个循环中的一个),并且如果完全运行ajax调用,则是在主(父)循环已经完成之后。 第二个只有在有警报的情况下才能正常工作。 如果用户确认警报,则第二个循环正确执行。 没有警报,第二个循环将被跳过。 任何人都可以弄清楚这里出了什么问题。 我已经尝试过ajax {complete:...}和ajax {}。done,但是它们也不起作用。 这是第一个片段:

 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; } }); }) } }); } 

这是第二个片段:

 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); } } 

这听起来像是一个异步问题,不是在循环中进行AJAX调用的最佳主意,尽管您可以递归地复制一个循环,让该函数仅进行一次调用,然后在每次调用完成后再次调用该函数,然后添加一个带有if的断点,检查您是否完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM