Возвращает длину массива json из наблюдаемой после завершения функции подписки - PullRequest
0 голосов
/ 04 марта 2019

У меня есть функция, которая получает наблюдаемое с массивом 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 голосов
/ 04 марта 2019

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

Первый вариант:

В вашем компоненте:

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
        ]
    });
 }
0 голосов
/ 05 марта 2019

Попробуйте и, пожалуйста, дайте мне знать, если есть какие-либо проблемы

 public getCountofProducts() {
    this.productService.getAllProducts().subscribe
    (
      (products) => {
          if (products!= null) {
             this.getCount(products);
             return this.productsLength;
           }
           else{
             return 0;
           }
       }
     );
 }

 public getCount(products){
    this.productsLength=this.products.length;
 }
0 голосов
/ 04 марта 2019

Вместо подписки на Наблюдаемое.Вы можете преобразовать Observable в Promise на .toPromise().Вам также необходимо сделать функцию async и поставить await перед функцией, которую вы применили .toPromise().Затем массив products будет храниться в переменной, называемой products, и после этого вы сможете использовать ее обычным образом.

Пример:

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

Когда вы вызываете эту функцию, вынеобходимо вызвать его в функции async с помощью await, прежде чем, если вы не вызовете его таким образом, он вернет только 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)});
}
...