当前位置: 首页 > 面试题库 >

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

谢灵均
2023-03-14
问题内容

我有一个数组queue,当对象被修改时,我会将对象推送到该数组。如果用户按下save,那么我将遍历queue并为他们应用适当的API调用。

如果API调用成功完成,我想从中删除该项目queue,否则将其保留在内部并通知用户某些项目未成功保存。我目前有这个(在AngularJS中)

var unsuccessfulItems = [];
var promise = queue.map(function(item) {
    var defer = $q.defer();
    myCallFunction( item
           , function( response ) {} // Success
           , function( response ) {  // Error
               unsuccessfulItems.push(item);
           }
    )
    defer.resolve();
    return defer.promise;
})
// Once all items have been processed
$q.all( promise ).then( function() {
    queue = unsuccessfulItems;
});

有更好的方法吗?


问题答案:

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

假设您不愿自我证明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; });
 });


 类似资料:
  • 问题内容: 我正在使用构建Web POST参数的方法,但是有一些值仅在它们不存在的情况下才想添加。 效果很好,但是如果我将变量设为可选,如何防止将其添加到参数中?像这样的东西(伪代码): 我希望这已经足够清楚了,有人知道如何解决吗? 问题答案: 创建初始字母后,您必须单独添加密钥: Python没有语法将键定义为条件键;如果您已经按顺序拥有所有内容,则可以使用dict理解: 但这不是很可读。 另一

  • 我正在建立一个应用程序,并使用MariaDB作为我的数据库。我有一张桌子“kick_votes”。其主键包含三个字段: null

  • 这周我刚刚开始学习C#并且正在尝试运行一个简单的代码,当用户输入文本时,它会提示用户输入一个数字,或者当用户输入一个负数时,它会提示用户输入一个正数(因此,对于文本是一个布尔运算,对于负数是一个if语句)。如果他们输入了一个有效的(正)数字,程序将继续进行其余的步骤。 然而,在此代码中,如果用户输入一个负数,然后输入一个文本,然后输入另一个负数,依此类推,似乎会中断循环并继续下一个操作。 代码是一

  • 我有一个dict1,我想从中删除为空的所有项目,这不仅意味着属性,而且意味着整个字典。 输出应如下所示: 注意:字典中可以有 N 个项目和/或同一字典中的 N 个键值对。此外,字典中可能有 N 个具有空值的 ,因此必须删除所有 b。

  • 问题内容: 我想从这些数据结构中按值删除满足某些条件的元素 从上一个问题中,我找到了使用的简洁答案,但是似乎需要精确匹配。 在这里,我想从表或映射中删除其值小于特定阈值的元素。您编写代码的方式是什么? 我只检查了两个答案,这些是关于map的答案,表情况如何?我的解决方案如下。 问题答案: Iterator iterator = hmap.values().iterator(); while (it

  • 问题内容: 我正在研究分配液体的应用程序。这是数据库的组织 罐: canister_id {PK} Ingredient_id {FK} 成分: Ingredient_id {PK} 成分名称 喝: Drink_id {PK} 饮料名称 成分: instance_id {PK} Drink_id {FK} Ingredient_id {FK} 数量 每种饮料都有多种成分(保存在Ingredient