订阅函数完成后,可观察到的json数组的返回长度

时间:2019-03-04 12:35:12

标签: angular subscribe

我有一个函数,其中包含可观察到的json数组,作为http get的响应:

 public getCountofProducts() {

        this.productService.getAllProducts().subscribe
        (
            (products) => {
                if (products!= null) {
                    this.productsLength = products.length;
                }
            }
        );
        return this.productsLength;
    }

功能的使用:

public getItems()
{
this.items=[

count: this.getCountofProducts()

            ]
}

getAllproducts()响应:  返回带有数组的可观察值

现在,该函数返回“ 0”,因为订阅函数未完成,我得到了初始化值,即“ 0”

如果我在订阅功能中执行console.log,则会显示正确的值。

订阅的函数完成后,获取值的方法是什么?

3 个答案:

答案 0 :(得分:1)

而不是订阅Observable。您可以通过ObservablePromise转换为.toPromise()。您还需要制作函数async并将await放在应用.toPromise()的函数之前。然后,products数组将存储在名为product的变量中,然后您可以正常使用它。

示例:

public async getCountofProducts() {
    const products = await this.productService.getAllProducts().toPromise();
    if(products !== null) {
      return products.length;
    } else {
      return 0;
    }
  }

调用此函数时,必须使用asyncawait函数中调用它,如果不这样调用,它将仅返回ZoneAwarePromise。除此之外,您还可以使用Promise访问类似.then()的值。

//You can call it like this
public async someFunction() {
 console.log(await this.getCountofProduts);
}
//OR
public someFunction() {
  this.getCountofProducts().then((result) => {console.log(result)});
}

答案 1 :(得分:0)

现在我想到了两个选择:第一个选择返回服务器调用并在组件中订阅它,否则返回一个Promise。

第一个选项:

在您的组件中:

public getItems()
{
    this.productService.getAllProducts().subscribe((products: Array<any>) => {
        this.items=[
            count: products ? products.length : 0;
        ]
    });

}

第二个选项:

product.service.ts

getAllProducts(): Promise<any[]> {
    return this.http.get('YOUR_URL').toPromise();
}

您的通话将如下所示。

public getCountofProducts() {
    return this.productService.getAllProducts().then
    (
        (products) => {
            if (products!= null) {
                this.productsLength = products.length;
                return this.productsLength;
            }
        }
    );
}

在您的组件中:

public getItems()
{
    this.getCountofProducts().then((len:number) => {
        this.items=[
            count: len
        ]
    });
 }

答案 2 :(得分:0)

尝试一下,如果有任何问题,请告诉我

# Stage 2
FROM nginx:1.15.8-alpine

COPY --from=node /usr/src/app/dist /usr/share/nginx/html

RUN rm /etc/nginx/nginx.conf /etc/nginx/mime.types
COPY nginx.conf /etc/nginx/nginx.conf
COPY mime.types /etc/nginx/mime.types