如何解决for循环中的所有promise?

时间:2015-09-15 05:44:51

标签: javascript jquery promise jquery-deferred

关于承诺的另一个问题。我有这种情况:

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()解析所有内容并返回数组?

2 个答案:

答案 0 :(得分:5)

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

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

一些一般性建议:

  • 您忽略了您在数据中重复的项目,我认为您不会在实际代码中执行此操作,只是确保这一点。
  • generally not the best idea在构造函数中执行异步IO。请考虑分离构造和初始化。
  • 您应该考虑使用本机承诺(或库)或使用支持non problematic promises的jQuery 3.0.0。

答案 1 :(得分: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)等待所有详细信息得到解析。完成后,每个细节&#39;返回数据将作为一个参数传递给回调函数,因此回调函数将接收总data.length个参数。然后我们使用Array.prototype.slice.call将所有参数转换为数组并返回结果。

供您参考:

What does $.when.apply($, someArray) do?

How can I convert the "arguments" object to an array in JavaScript?