观察者/用户代码块未按顺序执行

时间:2018-01-24 02:41:10

标签: angular

调用我的服务时,我有以下代码块。我所看到的是“IF-ELSE CODE BLOCK TWO'在“IF-ELSE CODE BLOCK ONE'之前执行”。为什么会发生这种情况,我需要做些什么来确保在代码块2之前执行代码块?

this.svsOrders.newOrderDetails(customerInfo).subscribe(
      (data:any)=>{           
       //IF-ELSE CODE BLOCK ONE
       if (data == 'Invalid User') {       
        this.isValidUser=false;
        let alert = this.alertCtrl.create({
          title: 'Submit Order',
          message: 'Access Denied',
          buttons: [
            {
              text: 'Ok',
              role: 'cancel',
              handler: () => {
                console.log('Cancel clicked');

              }
            }],
          enableBackdropDismiss: false
        });
        alert.present();       
      } //close if
      else {   
        this.svsSummary.newOrderInfo(data);       
      } //close else
      },

      error=>this.errorMessage=<any>error
    )   
        //IF-ELSE CODE BLOACK TWO
        if(this.isValidUser){
            console.log('isValidUser value(TRUE)', this.isValidUser)  
            this.navCtrl.setRoot(CategoryPage);
            this.navCtrl.popToRoot;
            this.svsSummary.clearItemList();
            return
        } else { 
          console.log('popping the page now.....')
          this.navCtrl.pop();
        }

感谢您的帮助。

A

1 个答案:

答案 0 :(得分:0)

this.svsOrders.newOrderDetails(customerInfo)操作完成之前,不会执行subscribe方法中的代码。但是,订阅后的代码将在订阅后立即执行。

所以处理顺序是:

  1. 订阅已定义的observable
  2. 执行Block 2代码。
  3. 订阅的Observable已完成并执行Block 1代码。
  4. 要更改此设置,您需要将Block 2代码移至在订阅范围内。

    如果您将两个代码块移动到一个方法中,然后从subscribe()调用该方法,则可能更清晰。

    这样的事情:

    this.svsOrders.newOrderDetails(customerInfo).subscribe(
          (data:any) => this.myMethod(),
          (error) => this.errorMessage=<any>error
    )  
    
    myMethod(): void {
     //IF-ELSE CODE BLOCK ONE
           if (data == 'Invalid User') {       
            this.isValidUser=false;
            let alert = this.alertCtrl.create({
              title: 'Submit Order',
              message: 'Access Denied',
              buttons: [
                {
                  text: 'Ok',
                  role: 'cancel',
                  handler: () => {
                    console.log('Cancel clicked');
    
                  }
                }],
              enableBackdropDismiss: false
            });
            alert.present();       
          } //close if
          else {   
            this.svsSummary.newOrderInfo(data);       
          } //close else
          }
            //IF-ELSE CODE BLOACK TWO
            if(this.isValidUser){
                console.log('isValidUser value(TRUE)', this.isValidUser)  
                this.navCtrl.setRoot(CategoryPage);
                this.navCtrl.popToRoot;
                this.svsSummary.clearItemList();
                return
            } else { 
              console.log('popping the page now.....')
              this.navCtrl.pop();
            }
    }