Angular 2:序列和并行服务调用

时间:2017-12-09 04:45:10

标签: angular rxjs

我遇到了序列和并行服务调用的主题。对于序列调用,我们可以使用flatmap / mergemap,对于并行调用,我们可以使用forkjoin。

以下是我的疑问

1)flatmap和mergemap有什么区别?是否有任何具体原因可以使用其中任何一种。

2)如何为4-5个电话添加多个序列?什么区分flatmap和mergemap如果我使用多个订阅?

this.service1.getCountry(
  .mergeMap(country => this.service1.getState(country[0]))
  .subscribe(state = > state.json());
);

3)forkjoin用于连接多个并行服务调用。如果我使用方法并在该方法中调用多个服务而不是使用forkjoin,该怎么办?使用forkJoin的任何具体原因

1 个答案:

答案 0 :(得分:2)

  1. <?php require_once'core/init.php'; include'includes/head.php'; ?> <!--Navegacion--> <?php include('includes/navigation.php'); ?> <!-- Cabecera--> <?php include('includes/headerfull.php'); ?> <!--left side bar--> <?php include('includes/leftbar.php'); ?> <?php $sql = "SELECT * FROM products WHERE featured = 1"; $featured= $db->query($sql); ?> <!--Detalles--> <!--main content--> <div class="col-md-8">Main <div class="row"> <h2 id="textoTitulo" class="text-center">Productos destacados</h2> <?php while($product= mysqli_fetch_assoc($featured)):?> <div class="col-md-3"> <h4><?php echo $product['title']?></h4> <img src="<?php echo $product['image']?>" id="producto2" imagenProducto" alt=<?php echo $product['title']?> class="img-thumb" /> <p class="list-price text-danger">Precio del Mercado <s>₡<?php echo $product['list_price']?></s></p> <p class="price">Nuestro precio: ₡<?php echo $product['price']?></p> <button type="button" class="btn butn-sm btn-success" data-toggle="modal" data-target="#details-<?php echo $product['id'];?>">Detalles</button> <?php include('includes/detailsmodal.php');?> </div> <?php endwhile;?> </div> </div> <!--Detalles--> <?php ?> <!--right--> <?php include('includes/rightbar.php'); ?> <!--pie--> <?php include('includes/footer.php'); ?> //modal.php file <div class="modal fade details-1" id="details-<?php echo $product['id'];?>" tabindex="-1" role="dialog" aria-labelledby="details-1" aria-hidden="true"> <div class="modal-dialog modal-lg"> <div class="modal-content"> <div class="modal-header"> <button class="close" type="button" data-dismiss="modal" arial-label="Close"> <span aria-hidden="true">&times;</span> </button> <h4 class="modal-title text-center"><?php echo $product['title']?> </h4> </div> <div class="modal-body"> <div class="container-fluid"> <div class="row"> <div class="col-sm-6"> <div class="center-block"> <img src="images/products/planta1.png" alt="Levis Jeans" id="viewProducto" class="details img-responsive"> </div> </div> <div class="col-sm-6"></div> <h4>Detalles</h4> <p><?php echo $product['description']?></p> <hr> <p>Precio :<?php echo $product['price']?></p> <p>Marca: N/A</p> <form action="add_cart.php" method="post"> <div class="form-group"> <div class="col-xs-3"> <label for="quantity">Cantidad:</label> <input type="text" class="form-control" id="quantity" name="quantity"> <p>Disponibles: 3</p> <div class="form-group"> <label for="size"></label> Size:<select name="size" id="size" class="form-control"> <option value="36">36</option> <option value="40">40</option> <option value="50">50</option> <option value="30">30</option> </select> </div> </div> </div> </form> </div> </div> </div> <div class="modal-footer"> <button class="btn btn-default" data-dismiss="modal">Cerrar</button> <button class="btn btn-warning" type="submit"><img class="cartPNG" src="images/logos/cart.png"> Agregar a Carrito</button> </div> </div> </div> </div> === func parseJSONData(_ jsonData: Data?) -> [String : AnyObject]? { if let data = jsonData { do { let jsonDictionary = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String : AnyObject]//Parses data into a dictionary // print(jsonDictionary) return jsonDictionary } catch let error as NSError { print("Error: \(error.localizedDescription)") } } return nil } 。 flatMap只是mergeMap运算符的别名。 (https://github.com/ReactiveX/rxjs/blob/master/src/add/operator/mergeMap.ts#L5-L6)有讨论要弃用一个别名,但到目前为止,v5都可用。

  2. 您可能对flatMap运算符(https://github.com/ReactiveX/rxjs/blob/master/spec/operators/mergeMap-spec.ts#L308-L325)中的mergeMap param感兴趣,该运算符订阅了多个内部可观察对象。

  3. 取决于用例。如果提供了可观察的gauranteed发射并等待完成,forkJoin可能是可行的。但是如果任何可观察的完成没有发射,forkJoin会短路并完成。相反,mergeMap更倾向于将内部可观察的发射平坦化为更高的可观察性。因此,在forkJoin的情况下,您将为每个innerobservable获取值emisssion数组,而mergeMap将在每个内部observable发出时立即发出单个值。