如何使用
.expand()进行递归调用呢?首先,创建一个递归函数并映射数据以供递归使用:
const recursiveAddProduct = (currentProductId, index, arr)=>{
return service.addProduct(currentProductId)
.map((response)=>{
return {
data:response,
index: index+1,
arr:arr
}
})
};
现在,在您的组件中递归调用它:
let reduced = recursiveAddProduct(productIds[0],0,productIds)
.expand((res)=>{
return res.index>res.arr.length-1 ? Observable.empty(): recursiveAddProduct(productIds[res.index],res.index,productIds)
});
reduced.subscribe(x=>console.log(x));
这里有一个可用的JSBin。
使用.expand
操作符的好处:
- 仍然使用Observables,可以链接任何你想要的操作符。
- 依次调用一个http请求,符合你的需求。
- 不需要担心错误处理,它们都链接到单个流中。只需在你的Observables中调用
.catch
即可。
- 可以对递归方法进行任何操作(数据操作等)
- 可以设置递归调用终止的条件。
- 一行代码(几乎)。
编辑
如果不喜欢内联三元运算符,可以使用.take()
操作符来终止递归,如下所示:
let reduced = recursiveAddProduct(productIds[0],0,productIds)
.expand(res=>recursiveAddProduct(productIds[res.index],res.index,productIds))
.take(productIds.length)
工作中 JSBin
productIds.forEach(productId => service.addProduct(productId)
这种方式不是很高效。建议将所有产品一次性发送到服务器。 - Hadi Farhadipush()
和shift()
实现。如果队列干净,则停止。 - Ismael Miguel