Angular2 линия вопроса исполнения

<a class='btn btn-primary' (click)='onSave()' style='width:80px'>
<i class='glyphicon glyphicon-chevron-right'></i> Save
</a>  

У меня есть приведенный выше вызов метода typescript, как показано ниже

onSave(): void  {  

      // this.SaveShipment();
      console.log("before Saving");
      let id = this.shipments.findIndex(i=> i.id === parseInt(this._routeParams.get('id').toString()));
      this.shipments.splice(id,1);
      this._shipmentService.saveShipment((id+1).toString(), this.shipment)
      .subscribe(shipment=> this.shipments.push(shipment));
      this._router.navigate(['ShipmentDetails',{'id':this._routeParams.get('id').toString()}]);
} 

Последняя строка вызывается первой, прежде чем что-либо произойдет. Может кто-нибудь помочь в этом? Спасибо заранее.

1 ответ

  1. Последняя строка не вызывается первой.

    Этот код, вероятно, работает не так, как вы ожидаете. Это асинхронный код и просто планирует код для последующего выполнения:

      this._shipmentService.saveShipment((id+1).toString(), this.shipment)
      .subscribe(shipment=> this.shipments.push(shipment));
    

    Эта строка выполняется после выполнения указанного выше кода:

      this._router.navigate(['ShipmentDetails',{'id':this._routeParams.get('id').toString()}]);
    

    Это может быть то, что вы хотите:

      this._shipmentService.saveShipment((id+1).toString(), this.shipment)
      .subscribe(shipment=> {
        this.shipments.push(shipment);
        this._router.navigate(['ShipmentDetails',{'id':this._routeParams.get('id').toString()}]);
      });
    

    Этот способ this._router.navigate(...)выполняется после ответа от saveShipment()поступившего.