【发布时间】:2014-08-24 03:18:57
【问题描述】:
我有一个处理程序队列,我需要按插入顺序执行,然后等待每个处理程序返回一个已解决的承诺,然后再执行下一个。
我决定使用递归函数将处理程序移出队列然后执行它。当处理程序解决其承诺时,该函数将递归调用自身,直到队列为空。
var executeHandler = function(handlers, instance){
var handler, cb = function(){
return executeHandler(handlers, instance);
};
if(handlers.length){
handler = handlers.shift();
return handler($q, instance).then(cb);
}
};
这是一个适当的解决方案。但是我不确定这是一个理想的解决方案。单步执行此功能时,很难遵循。
有没有更优化的方法来实现这一点?更重要的是更容易掌握的解决方案?
【问题讨论】:
-
如果我理解正确的话,也许你想看看
$q.all。 -
我看到的方法是使用
then()返回的promise来链接promise,你把它们放入数组有什么原因吗?你能再解释一下吗? -
@elclanrs
$q.all是我最初的结构。然而,它只是解决了一系列被解决或拒绝的承诺。我需要每个函数(即处理程序)在调用下一个之前等待前一个解决。 -
异步的东西本来就很难单步执行,而且我还没有看到任何调试工具或编码风格真正使它变得更容易。您最终只需要设置断点,因为您无法逐行遍历异步内容。就其本质而言,它完成了执行现在需要完成的事情,然后稍后调用一些回调,这不适合逐步调试。你所拥有的对我来说似乎是合理的。您也可以使用
.reduce()立即将它们链接在一起,但这对调试没有任何帮助。 -
我猜
.reduce模式并不比递归解决方案更容易逐步完成,但它正在迅速成为数组异步迭代的事实上的模式,因此(在时间上)更容易识别。
标签: javascript angularjs recursion promise