您已经在使用诺言,您可能希望端到端地兑现。另外,您过早地兑现了承诺。
假设您不愿自我证明
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; }); });
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)