简体   繁体   English

Angular 2如何处理异步调用

[英]Angular 2 how to handle asynchronous calls

First time button is clicked in form undefined is return, button has to be clicked twice to return correct result. 第一次以未定义形式单击按钮将返回,必须单击两次按钮才能返回正确的结果。 How do I not process until result is return. 返回结果后如何处理? When button clicked return correct result not previous one? 单击按钮后返回正确的结果不是上一个?

Product.componet.html Product.componet.html

 <div *ngIf="submitted">
    <h2>Product found</h2>
    <div class="row">
        <div class="col-xs-3">Price</div>
        <div class="col-xs-9  pull-left">Product details</div>
        <div class="col-xs-3">{{ product.price }}</div>
        <div class="col-xs-9  pull-left">{{product.description}}</div>
    </div>
</div>
<div *ngIf="result">
    <h2>No Product found</h2>
</div>

Product.compontent.ts Product.compontent.ts

onSubmit() {
    if (this.formModel.valid) {
        this.submitted = false;
        this.result = false;

        lens id = this.formModel.controls['id'].value;

        this.productService.getProductOne(id)
            .subscribe(product => this.product = product)

        //Check to see if object undefined
        if (this.product) {                
            if (this.product.id != 0)
            {
                this.submitted = true;
            }
            else    
            {
                this.result = true;
            }                
        }
    }
}

product-service.ts 产品service.ts

  getProductOne(id: number): Observable<Product> {
      // Parameters obj
      let params: URLSearchParams = new URLSearchParams();
      params.set('id', id.toString());

      //Http request
      return this.http
          .get("api/getProduct", {
              search: params
          })
          .map(response => response.json())
          .catch(handleError);
  }

Web api – ProductController.cs Web API – ProductController.cs

 [Route("api/getProduct")]
    public Product GetProduct(int id)
    {
        var product = products.FirstOrDefault((p) => p.id == id);

        if (product == null)
        {
            product = new Product();
        }

        return product;
    }

Modify your onSubmit() in Product.compontent.ts this way : 以此方式在Product.compontent.ts中修改onSubmit()

onSubmit() {
        if (this.formModel.valid) {
            this.submitted = false;
            this.result = false;

            lens id = this.formModel.controls['id'].value;

            this.productService.getProductOne(id).subscribe(
                    (product) => {
                     this.product = product;
                        //Check to see if object undefined
                        if (this.product) {                
                            if (this.product.id != 0)
                            {
                                this.submitted = true;
                            }
                            else    
                            {
                                this.result = true;
                            }                
                        }
              });
        }
    }

This happens because of this product => this.product = product . 发生这种情况是因为此product => this.product = product It assign product into this.product ,but before that program executes other codes which are after the .subscribe(product => this.product = product) 它将product分配给this.product ,但是在该程序执行其他代码之前,该代码位于.subscribe(product => this.product = product)

what you need to do is just pass the observable to HTML and get values using | async 您需要做的就是将observable传递给HTML并使用| async获得值| async | async pipe.like this. | async管道。

Product.compontent.ts Product.compontent.ts

  products: any;
  onSubmit() {
    if (this.formModel.valid) {
      this.submitted = false;
      this.result = false;

      lens id = this.formModel.controls['id'].value;
      this.products = this.productService.getProductOne(id);
    }
  }  

Product.componet.html Product.componet.html

<div [hidden]="!(products|async)?.id !=0">
  <h2>Product found</h2>
  <div class="row">
    <div class="col-xs-3">Price</div>
    <div class="col-xs-9  pull-left">Product details</div>
    <div class="col-xs-3">{{(products|async)?.price }}</div>
    <div class="col-xs-9  pull-left">{{(products|async)?.description }}</div>
  </div>
</div>
<div [hidden]="!(products|async)?.id ==0">
  <h2>No Product found</h2>
</div>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM