栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数组上的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; }); });


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/636268.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号