переменная angular2 становится неопределенной в почтовом запросе, сбой синхронизации

Я работаю над веб-приложением электронной коммерции, используя Angular2.

Я сохранил упорядоченную информацию в сеансе.

addToCart(productId:string,noOfItems:number):void{
    let itemCounts;
    let selectedItems=[];

    if(sessionStorage.hasOwnProperty("cartItemCount"))
    {
        itemCounts = parseInt(sessionStorage.getItem("cartItemCount"));
        itemCounts++;
        sessionStorage.setItem("cartItemCount",itemCounts.toLocaleString());
    }else{
        sessionStorage.setItem("cartItemCount","1")
    }
    this._addtocartService.updateCount.emit("itemAdded");
    this._notificationService.success("Success","item added to Cart");
    let item={
        productId:productId,
        productName:this.productDetail.name,
        packageName:this.selectedPackage.packageName,
        Rate:this.selectedPackage.price,
        unit:this.selectedPackage.unitPerQuantity,
        quantity:noOfItems,
        packageId:this.selectedPackage._id,
        owner:this.owner._id
    }
    if(sessionStorage.getItem("CartContent") != undefined)
    {
        let test = JSON.parse(sessionStorage.getItem("CartContent"));
         for(let loop=0;loop<test.length;loop++) {
             if(test[loop].productId==productId) {

             }
         }
    }
    if(sessionStorage.hasOwnProperty("CartContent")) {

        selectedItems=JSON.parse(sessionStorage.getItem("CartContent"));
    }
    selectedItems.push(item);
    sessionStorage.setItem("CartContent",JSON.stringify(selectedItems));
    console.log(sessionStorage.getItem("CartContent"));
}

У меня есть компонент cartItem, в котором должна отображаться вся заказанная информация. В этом компоненте я получаю заказанные элементы из сеанса, подобные этому.

export class cartItemComponent{
private Orders:any;
private total:number;
constructor(private dataService:DataService,
            private loggerService:LoggerService){

    this.getCartContent();
    this.calculatePrice();


}
 getCartContent(){
    this.Orders = JSON.parse(sessionStorage.getItem("CartContent"));

    console.log("from Orders");
    console.log(this.Orders);
    var products = JSON.parse(sessionStorage.getItem("product"));

 }

 calculatePrice() {
     let i;

     for (i = 0; i < this.Orders.length; i++) {
         console.log("this is order");
         console.log(this.Orders[i]);

         this.dataService.post("order/prices", this.Orders[i])
             .subscribe(res => {
                console.log(res);
                console.log(this.Orders[i]);
                this.total+=res.totalPrice;
                 this.Orders[i]['totalPrice'] = res.totalPrice;
             });

         console.log("Total is " + this.total);
         if(i==this.Orders.length){
             this.loggerService.log(this.Orders,"green");
         }
         // setTimeout(()=>{
         //     for (i=0;i<this.Orders.length;i++){
         //         this.Orders[i]['totalPrice']=233;
         //     }
         //
         //     console.log("inside timeout");
         // },3000);

     }
 }

 //}

}

Я передаю эту информацию в API из метода calculatePrice(), чтобы получить только общую стоимость каждого типа предметов из API. Но внутри этой подписки this.Orders[i] не определено, и я не могу добавить новый ключ json this.Orders[i]['totalPrice'] и его значение внутри него.

Затем я должен отобразить эту информацию в таблице, используя оператор цикла.

Помощь будет оценена


person Bipin Paudel    schedule 23.12.2016    source источник
comment
Пожалуйста, добавьте больше контекста. Этот код вырван из контекста, и я могу только строить предположения, почему он работает не так, как вы ожидаете.   -  person ppovoski    schedule 23.12.2016
comment
отредактировано. спасибо @ppo   -  person Bipin Paudel    schedule 23.12.2016


Ответы (1)


я думаю, что то, как вы передаете заказ внутри службы данных, создает проблему. вы пытаетесь получить доступ к значению i внутри подписки, и подписка не работает синхронно. Поэтому попробуйте получить ссылку на текущий заказ в другой переменной, а затем передать ее в dataService следующим образом.

calculatePrice() {
let i;

for (i = 0; i < this.Orders.length; i++) {
  console.log("this is order");
  console.log(this.Orders[i]);

  let currOrder = this.Orders[i];  //get current order in a variable

  this.dataService.post("order/prices", currOrder)
    .subscribe(res => {
      console.log(res);
      console.log(currOrder);
      this.total+=res.totalPrice;
      this.currOrder['totalPrice'] = res.totalPrice;
    });

  console.log("Total is " + this.total);
  if(i==this.Orders.length){
    this.loggerService.log(this.Orders,"green");
  }
 }
}
person HirenParekh    schedule 23.12.2016