Как заставить компилятор Angular дождаться подписки перед возвратом

#angular #typescript #asynchronous #subscribe

Вопрос:

У меня есть функция, которая должна возвращать значение, и внутри нее у меня есть подписка, моя проблема в том, что строка возврата выполняется до окончания подписки,

 testFunc(){
let objectType;
          let moduleId;
          objectType = valueAsString.split('|');
          objectType = objectType[0];
          this.layoutService.moduleIdByType(objectType)
            .toPromise().then(data => {
              moduleId = data;
            });
          return { IsById: true, LinkedModule: moduleId };
}
 

здесь у меня есть (moduleIdbytype), и он изменяет значение переменной ModuleID
, и я должен вернуться после завершения подписки и изменения значения var

Комментарии:

1. Если вы тестируете его с помощью jasmine, вы можете использовать обратный вызов в качестве первого параметра вашего метода тестирования, а затем вызвать этот обратный вызов, когда ваш тест будет завершен. Кроме того, тайм-аут по умолчанию приведет к сбою теста, если обратный вызов не будет вызван

Ответ №1:

Вы можете сделать свой TestFunc() асинхронным и дождаться подписки.

 async testFunc(){
 let objectType;
 let moduleId;
 objectType = valueAsString.split('|');
 objectType = objectType[0];
 const moduleId  = await this.layoutService.moduleIdByType(objectType)
 .toPromise();
 return { IsById: true, LinkedModule: moduleId };
}
 

Комментарии:

1. Я попробовал этот способ, но возвращаемое значение функции сбивало с толку, __zone_symbol__state: null __zone_symbol__value: [] Symbol(Symbol.species): (...) Symbol(Symbol.toStringTag): (...) [[Prototype]]: Object

2. TestFunc() теперь является асинхронной функцией, которую вы можете использовать либо в режиме ожидания, либо в режиме обещания->затем(> developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… )