使用jQuery延迟和承诺内部循环

时间:2017-11-05 19:20:24

标签: jquery jquery-deferred object-literal

这就是我想要实现的目标,

我有一个排序数组,我分别传递给jQuery。每个内部都有一个ajax调用,它将获取所需的数据,每次进入另一个数组(让我们称之为allJsonData)。最后我显示allJsonData。 问题是每当我显示allJsonData时,元素总是不一致地显示(不按字母顺序/随机顺序)。我期望allJsonData按字母顺序显示(首先是AList数据,第二个是BList数据,第三个是CList数据,依此类推)。 我是jQuery延期和承诺的新手。提前谢谢。

var sortedArray = [AList, BList, CList, DList];
var promises = [];
var allJsonData = [];
$.each(sortedArray, function (index, value) {
var dfd = $.Deferred();
var url = _spPageContextInfo.webAbsoluteUrl  + ('/_api/Web/Lists/GetByTitle(' + "'" + value + "'" + ')/Items? + "SomeFilterParameters";

//AJAX CALL HERE//
.done(
  function (approvedListItems) {
    if (approvedListItems.d.results.length != 0) {
      $.each(approvedListItems.d.results, function (i, col) {
        allJsonData.push(col);//Push into master array
      });
    }//If closed
    dfd.resolve(allJsonData);
  }
);//Done closed
  promises.push(dfd);
});//jQuery Each closed
return $.when.apply($, promises).promise();

/ **** AJAX CALL **** /

getListItems: function(url) {       
  var dfd = $.Deferred();
    $.ajax({
      url: url,
      type: "GET",
      headers: {
        "accept": "application/json;odata=verbose",
      },
    success: function (data) {
      dfd.resolve(data);
    },
    error: function (error) {
      dfd.reject(sender, args, "Error retrieving items");
    }
  });
  return dfd.promise();         
},

1 个答案:

答案 0 :(得分:0)

我认为你可以做一些简单的事情:

var sortedArray = [AList, BList, CList, DList];

Promise.all(sortedArray.map(function(value) {
    var url = ...;
    return getListItems(url);
})).then(function(results) {
    // results is an array of results from AList, BList, CList, DList in order
    let allJsonData = [];
    results.forEach(function(approvedListItems) {
        allJsonData.push.apply(allJsonData, approvedListItems.d.results);
    });
    // process allJsonData here
});

// simplify getListItems like this
getListItems: function(url) {       
    return $.ajax({
        url: url,
        type: "GET",
        headers: {
            "accept": "application/json;odata=verbose",
        }
    });
},

这里的一般想法是,您为sortedArray中的每个项目获取一个原始列表(不处理其中的子结果)。使用Promise.all()$.when(),您将按顺序获取原始列表。然后,在拥有所有原始列表之后,可以按顺序处理它们并按顺序构建allJsonData结构。

此外,您可以从getListItems()中删除承诺反模式。 $.ajax()已经返回一个promise,因此不需要将它包装在另一个promise中。

如果您真的想要,可以将其转换为使用$.when()而不是Promise.all(),但使用$.when()会更复杂,因为它需要如何获取参数并返回结果。< / p>

此外,url变量中的Javascript字符串语法有问题。我不知道你打算在那里做什么,所以我不确定该建议什么,但你也需要解决这个问题。