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

我有一个数组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; });

});

以上是 数组上的JavaScript .map并在满足条件的情况下删除项目 的全部内容, 来源链接: utcz.com/qa/428760.html

回到顶部