Как вернуть логическое значение из функции, которая подписывается на наблюдаемую другую функцию? - PullRequest
0 голосов
/ 27 апреля 2019

У меня есть эта проблема, у меня есть ProductService, который имеет логическую функцию validateProductsBeforeChanges.

Внутри validateProductsBeforeChanges Я вызываю функцию из другой службы с именем OrderService, которая возвращает наблюдаемое.

Пример кода:

validateProductsBeforeChanges(idProduct): Boolean {
     this._orderService.getAll()
         .subscribe(orders => {
               this.orders = orders;
               this.ordersWithCurrentMenu = this.orders.filter(x => 
                                                               x.products.find(y => y.code == idProduct));

               if(this.ordersWithCurrentMenu.length > 0) {
                   return false;
               }
               else {
                   return true;
               }
         });
}

Проблема в том, что vsВ коде выдается синтаксическая ошибка:

Функция, объявленный тип которой не является ни void, ни any, должна возвращать значение

Поэтому я попытался сделать что-то вроде этого:

validateProductsBeforeChanges(idProduct): Boolean {
     this._orderService.getAll()
         .subscribe(orders => {
              this.orders = orders;
              this.ordersWithCurrentMenu = this.orders.filter(x => x.products.find(y => y.code == idProduct));

              if (this.ordersWithCurrentMenu.length > 0) {
                  return false;
              }
              else {
                  return true;
              }
         });

    return false;
}

Но в этом случае последний возврат выполняется до окончания .subcribe, а функция всегда возвращает false.

Есть идеи, как это решить?

Большое спасибо!

1 Ответ

1 голос
/ 27 апреля 2019

Примерно так:

validateProductsBeforeChanges(idProduct): Observable<Boolean>{
  return this._orderService.getAll()
  .pipe(
      map(orders => 
       orders.filter(x => x.products.find(y => y.code == idProduct))
             .map(filtered => filtered <= 0)
      )          
   );
}

Используйте вот так:

validateProductsBeforeChanges(id).subscribe(t=> {
     if (t) {
        ...
     }
     else {
       ...
     }
})
...