Почему срабатывает триггер наблюдаемого? - PullRequest
1 голос
/ 18 мая 2019

Я не могу понять, почему добавление .take (1) в конце моей наблюдаемой приводит к получению результата, а если нет, то продолжает ждать:

   function generateToken(identifier){
      return new Observable<string>((observer) => {

        jwt.sign(identifier, 'devsecret', (err, token) => {
          if (err) {
            observer.error(err);
          } else if (token) {
            observer.next(token);
          }
        });
      }).pipe( take(1)); 
   }

Кто-нибудь знает почему? Вы хотите поделиться причиной и правильной ли это реализацией? Имейте в виду, что я не подписываюсь на эту функцию где-либо еще, но я продолжаю обмениваться результатами.

здесь я вызываю метод и возвращаю ответ с заголовком авторизации

  public login(identifier): Observable<any> {
    return generateToken(identifier).pipe(
      catchError((err: Error) => of(err)),
      map(token => {
       return {'Authorization': token}
      }));
  }

и последнее, но не менее важное: эта функция преобразуется в обещание, а ответ возвращается в виде http-запроса

function async userLogin(identifier) {
    return await login(identifier).toPromise();
}

Спасибо за ваше время и терпение

Ответы [ 3 ]

1 голос
/ 19 мая 2019

Это объясняет вашу проблему:

return await login(identifier).toPromise();

Promise разрешает завершение Observable или отклоняет, если он ошибается, поэтому он работает с take(1), потому что он принимает первое наблюдаемое значение и завершает его.

Вы также можете получить вывод, если завершите его.И это выглядит немного более подходящим:

} else if (token) {
  observer.next(token);
  observer.complete();  <---
}
1 голос
/ 19 мая 2019

take(1) удостоверяется, что метод subscriber.complete() вызывается сразу после выхода первого элемента. Кстати, это можно сделать напрямую, позвонив observer.complete() после observer.next().

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

0 голосов
/ 18 мая 2019

Попробуйте

.pipe( () => take(1) );

Или

.pipe( take );

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

...