Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.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 JQuery中对MongoDB查询的Ajax调用每个循环都会影响结果的顺序_Javascript_Jquery_Ajax - Fatal编程技术网

Javascript JQuery中对MongoDB查询的Ajax调用每个循环都会影响结果的顺序

Javascript JQuery中对MongoDB查询的Ajax调用每个循环都会影响结果的顺序,javascript,jquery,ajax,Javascript,Jquery,Ajax,我尝试运行一个AJAX调用,该调用执行mongoDB查询并在JQuery循环中返回排序结果。排序后的数据库结果不会以正确返回的顺序追加到列表中。将用户设置为true的某些结果附加到列表中的位置不正确。如果删除对AJAX/MongoDB功能的itemQuery()函数调用,列表项将按正确的排序顺序追加。知道我做错了什么吗 $.each(items, function (i, item) { //itemQuery() holds ajax call that runs mongoDB qu

我尝试运行一个AJAX调用,该调用执行mongoDB查询并在JQuery循环中返回排序结果。排序后的数据库结果不会以正确返回的顺序追加到列表中。将
用户
设置为
true
的某些结果附加到列表中的位置不正确。如果删除对AJAX/MongoDB功能的itemQuery()函数调用,列表项将按正确的排序顺序追加。知道我做错了什么吗

$.each(items, function (i, item) {
    //itemQuery() holds ajax call that runs mongoDB query and returns sorted results
    itemQuery(item._id).done(function(data) {
        if (data.length > 0) {
            has_users = true;
        } else {
            has_users = false;
        }

        listItem = buildListItem(item, has_users);
        $('#list_dropdown').append(listItem);
    });

}); 

一些Ajax调用在其他调用之前完成,因此您得到了错误的顺序。您可以使用而不是
$。each()
,返回承诺,并使用等待所有承诺完成,然后追加元素

您的代码可以是这样的:

$.when(
  $.map(items, function (i, item) {
    //itemQuery() holds ajax call that runs mongoDB query and returns sorted results
    return itemQuery(item._id).done(function(data) {
        if (data.length > 0) {
            has_users = true;
        } else {
            has_users = false;
        }

        return buildListItem(item, has_users);
    });
  })
).then(function (elements) {
  $('#list_dropdown').append(elements);
});

一些Ajax调用在其他调用之前完成,因此您得到了错误的顺序。您可以使用而不是
$。each()
,返回承诺,并使用等待所有承诺完成,然后追加元素

您的代码可以是这样的:

$.when(
  $.map(items, function (i, item) {
    //itemQuery() holds ajax call that runs mongoDB query and returns sorted results
    return itemQuery(item._id).done(function(data) {
        if (data.length > 0) {
            has_users = true;
        } else {
            has_users = false;
        }

        return buildListItem(item, has_users);
    });
  })
).then(function (elements) {
  $('#list_dropdown').append(elements);
});

$。每个
都是同步的,因此所有Ajax调用基本上都是一次启动的。元素是按照Ajax调用接收响应的顺序追加的,这是不确定的。您不能创建一个
json
列表并在一个Ajax请求中发送所有ID吗?使用此代码会在服务器上产生大量流量,这取决于项目的数量
$。每个
都是同步的,因此所有Ajax调用基本上是一次启动的。元素是按照Ajax调用接收响应的顺序追加的,这是不确定的。您不能创建一个
json
列表并在一个Ajax请求中发送所有ID吗?根据项目的数量,使用此代码会在服务器上产生大量流量