动态推入$q.all()承诺数组
Dynamic pushing to $q.all() promise array
基本上我试图在angular中创建一个承诺队列,它的工作方式有点像$q.all()
,除了它允许我在 $q.all()
执行后将更多的承诺推到数组上。
为了更好地解释,想象一下给一个函数一个承诺,你想为它执行then()
的一些代码。然而,当你在等待第一个承诺解决时,你给了函数第二个承诺。现在我不希望在两者都完成之前调用then()
(类似于$q.all()
)。如果第一个承诺在第二个承诺提供之前完成,then()
函数将被调用两次。这应该可以用于任意数量的承诺。
本质上你结束了一个承诺队列,每次队列被清空时执行一次then()
(即所有当前提供的承诺都被解决了)。我相信我能想出一个很好的方法来做到这一点,只是看看是否有人在SO镇已经实现了一些东西,或者有一个简单的选择,我错过了。
我也遇到过类似的情况,也许这对你有帮助。
我需要通过AJAX调用遍历树来构建一个表示整个树的对象。当我进行AJAX调用时,它将为我提供关于子节点的数据,然后我必须进行AJAX调用以获取它们的数据。我需要在渲染之前有完整的树,所以我需要知道我什么时候完成。
$q的问题。你可以给它传递一个承诺数组,但是这个数组在那时是固定的,即使你稍后向数组中添加更多的承诺。
我的解决方法是跟踪未应答请求的数量并重做$q。如果有未完成的请求。
var promisesArr = [];
var unresolved = 0;
function getChildNodes(node) {
var url = BASE_URL + '/' + node.id;
var prom = $q(function (resolve, reject) {
unresolved++;
$http.get(url).then(function (resp) {
angular.forEach(resp.data.children, function(v){
var newNode = {};
newNode.id = v.id;
getChildNodes(newNode);
node.children.push(newNode);
});
resolve();
unresolved--;
}, function () {
// Need to handle error here
console.log('ERROR');
reject();
unresolved--;
})
});
promisesArr.push(prom);
}
rootNode = {id: 1}
getChildNodes(rootNode);
allResolved();
function allResolved() {
if (unresolved > 0) {
$q.all(promisesArr).then(allResolved);
} else {
RenderTree(rootNode);
}
}
相关文章:
- Bluebird中承诺链数组的串行执行
- 如何按顺序执行承诺数组
- 角度 - 数组从承诺更新,整数不更新
- 链承诺.all 与从上一个承诺返回的数组.all.
- 链接返回承诺数组的函数
- 如何使用 Parse.promise javascript 定义一个承诺数组并获取结果数组 [parse.com]
- 实现时,将承诺数组转换为值数组
- Q.承诺数组,如果满足1个以上,则发出警报
- Node js没有解析承诺数组
- Emberjs拆分承诺数组
- 在AngularJS中向承诺数组中添加一个项
- 我如何从forEach循环中实现一个扁平的承诺数组?
- 动态推入$q.all()承诺数组
- 获取承诺数组的大小(量角器)
- 试图发送angular动态承诺数组来表示服务器
- 在承诺数组之间添加延迟
- 如何构造一个jquery承诺数组
- 用Angular UI Router解析承诺数组
- js承诺数组
- 使用'all'承诺数组上的聚合函数