您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

数组上的JavaScript .map并在满足条件的情况下删除项目

数组上的JavaScript .map并在满足条件的情况下删除项目

您已经在使用诺言,您可能希望端到端地兑现。另外,您过早地兑现了承诺。

假设您不愿自我证明myCallFunction自己处于次优状态,那么您仍然应该对它进行自我介绍。

function myCall(item){
    var d = $q.defer();
    myCallFunction(item,function(r){ d.resolve({val:r,item:item});}
                       ,function(r){ d.reject(r);});
    return d.promise;
}

请注意,我们是 完成异步功能 而不是在此之前解决延迟问题。

现在,我们需要实现一个“结算”功能,该功能可以解决无论何时完成所有承诺的情况。这就像$q.all但将等待所有诺言解决而不是兑现。

function settle(promises){
     var d = $q.defer();
     var counter = 0;
     var results = Array(promises.length);
     promises.forEach(function(p,i){ 
         p.then(function(v){ // add as fulfilled
              results[i] = {state:"fulfilled", promise : p, value: v};
         }).catch(function(r){ // add as rejected
              results[i] = {state:"rejected", promise : p, reason: r};
         }).finally(function(){  // when any promises resolved or Failed
             counter++; // notify the counter
             if (counter === promises.length) {
                d.resolve(results); // resolve the deferred.
             }
         });
     });
}

在大多数promise实现中都存在这种结算功能,而在中没有$q。我们也可以使用拒绝和来完成此操作$q.all,但这将意味着流量控制例外,这是一个不好的做法。

现在,我们可以settle

 settle(queue.map(myCall)).then(function(results){
     var Failed = results.filter(function(r){ return r.state === "rejected"; });
     var FailedItems = Failed.map(function(i){ return i.value.item; });
 });
javascript 2022/1/1 18:15:54 有498人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶