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

Ajax call to a MongoDB query in a JQuery each loop is affecting the order of results

本文关键字:查询 MongoDB 结果 顺序 调用 影响 JQuery 循环 Ajax      更新时间:2023-09-26

我试图运行一个AJAX调用,执行mongoDB查询并在JQuery每个循环中返回排序的结果。排序后的数据库结果不会以正确返回的顺序追加到列表中。一些将has_users设置为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调用在其他调用之前完成,因此您会得到错误的顺序。您可以使用$.map()代替$.each(),返回一个Promise,使用$.when()等待所有Promise完成,然后添加元素。

你的代码可以像这样:

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