Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在数组上迭代不会';你做事不井然有序吗?_Javascript_Html_Arrays - Fatal编程技术网

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