如何解析for循环中的所有承诺

how to resolve all promises in a for loop?

本文关键字:承诺 何解析 for 循环      更新时间:2023-09-26

又是一个关于承诺的问题。我有这样一个场景:

Service.prototype.parse = function (data) {
    var deferred = $.Deferred();
    var arr      = [];
    for (var i = 0; i < data.length; i++) {
        var details = new Details();
        $.when(details).then(function (data) {
            arr.push(data);
            deferred.resolve(arr);
        });
    }
    return deferred.promise;
};

在代码的其他地方:

...
$.when(parse()).then(function (resp) {
   //...
});

承诺在某个点得到解决,但最初resp的长度为1。

如何等待parse()解决一切并返回一个数组?

不需要延迟的反模式(显式构造)或显式数组构造。您的代码可以简化为:

Service.prototype.parse = function (data) {
     return $.when.apply($, data.map(function(x){
         return new Details(); 
     }).then(function(){ return arguments; });//.then(Array.of); // instead, if want array
};

一般建议:

  • 你忽略了你在数据中迭代的项目,我假设你在实际代码中不会这样做,但只是确保。
  • 在构造函数中执行异步IO通常不是最好的主意。请考虑将构造和初始化分开。
  • 你应该考虑使用原生承诺(或库)或使用jQuery 3.0.0,它支持无问题的承诺。

请试试:

Service.prototype.parse = function(data) {
  var detailsArr = [];
  for (var i = 0; i < data.length; i++) {
    var details = new Details();
    detailsArr.push(details);
  }
  return $.when.apply($, detailsArr).then(function(){
    return Array.prototype.slice.call(arguments);
  });
};

这里我们把所有的细节放到一个数组中,使用$.when。apply($, arr)等待所有细节得到解析。完成后,每个Details的返回数据将作为一个参数传递给回调函数,因此回调函数将接收总data.length个数的参数。然后使用array .prototype.slice.call将所有参数转换为数组并返回结果。

供参考:

$.when。apply($, someArray) do?

如何转换"参数"?对象数组在JavaScript?