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

Pat*_*cow 3 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;
};
Run Code Online (Sandbox Code Playgroud)

代码中的其他地方:

...
$.when(parse()).then(function (resp) {
   //...
});
Run Code Online (Sandbox Code Playgroud)

承诺在某些时候得到解决,但最初resp的长度为1.

如何等待parse()解决所有问题并返回数组?

Ben*_*aum 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
};
Run Code Online (Sandbox Code Playgroud)

一些一般建议:

  • 你忽略了你在数据中迭代的项目,我假设你不是在你的真实代码中这样做而只是确保.
  • 通常不是个好主意在构造函数中异步IO来执行.请考虑分离构造和初始化.
  • 您应该考虑使用本机promises(或库)或使用支持无问题promise的 jQuery 3.0.0 .