Javascript 在数组上迭代不会';你做事不井然有序吗?
下面的代码在运行时起作用,但似乎没有按顺序追加帖子(有时Javascript 在数组上迭代不会';你做事不井然有序吗?,javascript,html,arrays,Javascript,Html,Arrays,下面的代码在运行时起作用,但似乎没有按顺序追加帖子(有时post_2是第一位,而post_4是第二位): 它在数组中的元素上循环,并为每个元素下载一个标记文档,将其转换为HTML,然后将其附加到正文中。我尝试了一个简单的for循环,以及下划线的\uU4.each()函数。所有三个都有相同的结果,运行时它们不会按顺序追加文档(因此,当我单击“刷新”时,标题的顺序不同)。您知道为什么会发生这种情况以及解决方法吗?$。ajax是一个异步函数,意味着所有的$。异步函数都是并行发生的,并将按照完成的顺序附
post_2
是第一位,而post_4
是第二位):
它在数组中的元素上循环,并为每个元素下载一个标记文档,将其转换为HTML,然后将其附加到正文中。我尝试了一个简单的
for
循环,以及下划线的\uU4.each()
函数。所有三个都有相同的结果,运行时它们不会按顺序追加文档(因此,当我单击“刷新”时,标题的顺序不同)。您知道为什么会发生这种情况以及解决方法吗?$。ajax
是一个异步函数,意味着所有的$。异步
函数都是并行发生的,并将按照完成的顺序附加到主体中(很明显,这取决于他们获取的文档的大小和一般网络延迟)
您可能希望查看该库,该库允许您并行运行AJAX调用,然后在所有调用完成后执行回调。您可能希望使用
async.parallel
函数,该函数将每个AJAX调用的结果作为数组传递给最终回调。$。AJAX
是一个异步函数异步函数是并行执行的,并将按照完成的顺序附加到正文中(这显然会根据它们获取的文档大小和一般网络延迟而有所不同)
您可能希望查看该库,它允许您并行运行AJAX调用,然后在所有调用完成后执行回调。您需要使用
async.parallel
函数,该函数将每个AJAX调用的结果作为数组传递给最终回调。这正是jQuery和ar的类型e的意思是帮助。您传递一系列延迟(jQuery的$。ajax
返回一个延迟),当他们的承诺解决时,您可以单独处理每个延迟。下面是jQuery API文档本身的一个修改示例:
$.when($.ajax(“/page1.php”),$.ajax(/page2.php”).done(函数(a1,a2){
/*a1和a2是为page1和page2 ajax请求解析的参数*/
});
传递到.done
的回调函数只有在所有承诺都已解决时才会运行。因此,即使对page2的请求可能在page1之前完成,我们也不担心。直到所有请求都已完成,才会调用我们的代码
在您的特定情况下,如果异步请求的数量未知且有所不同,则使用func.apply
可能会获得更大的成功:
var需求=[];
请求推送($.ajax(“post_1.md”)、$.ajax(“post_2.md”)、$.ajax(“post_3.md”);
$.when.apply(此,请求).done(函数(){
$.each(参数、函数(索引、值){
console.log(值[0]);
});
});
这正是jQuery想要帮助的类型。您传递一系列延迟(jQuery的$。ajax
返回一个延迟),当他们的承诺解决时,您可以分别处理每一个延迟。下面是jQuery API文档本身的一个修改示例:
$.when($.ajax(“/page1.php”),$.ajax(/page2.php”).done(函数(a1,a2){
/*a1和a2是为page1和page2 ajax请求解析的参数*/
});
传递到.done
的回调函数只有在所有承诺都已解决时才会运行。因此,即使对page2的请求可能在page1之前完成,我们也不担心。直到所有请求都已完成,才会调用我们的代码
在您的特定情况下,如果异步请求的数量未知且有所不同,则使用func.apply
可能会获得更大的成功:
var需求=[];
请求推送($.ajax(“post_1.md”)、$.ajax(“post_2.md”)、$.ajax(“post_3.md”);
$.when.apply(此,请求).done(函数(){
$.each(参数、函数(索引、值){
console.log(值[0]);
});
});
谢谢。这正是我想要的;不确定我自己怎么没有注意到这一点。@RafalChmiel很高兴这就是你想要的,如果你不介意的话,请将此标记为接受的答案:)当然,另外,我只是在查看时设置了async:false
,以使其同步。@RafalChmiel不使其同步;这需要更长的等待时间,因为一次只发出一个请求。相反,您应该处理从$.ajax
返回的延迟请求,并响应其已解决的承诺。谢谢。这正是我想要的;不知道我自己怎么没有注意到这一点。@RafalChmiel很高兴这就是你要找的,如果你不介意的话,请将此标记为已接受的答案:)当然,另外,我只是在查看时设置了async:false
,以使其同步。@RafalChmiel不使其同步;这需要更长的等待时间,因为一次只发出一个请求。相反,您应该处理从$.ajax
返回的延迟代码,并对其已解决的承诺作出响应。@RafalChmiel我已经更新了上面的代码,使其更接近您的情况。谢谢,我会尝试一下。@RafalChmiel我已经更新了上面的代码,使其更接近您的情况。谢谢,我会尝试一下。
var posts = [
"post_1.md",
"post_2.md",
"post_3.md",
"post_4.md",
"post_5.md",
"post_6.md",
"post_7.md"];
for (var i in posts) {
$.ajax({
url: "posts/" + posts[i],
context: document.body,
success: function (mdText) {
var converter = new Showdown.converter();
var htmlText = converter.makeHtml(mdText);
$("body").append(htmlText);
}
});
}