Привет, ребята, у меня есть следующий код:
return this.facebook.getFacebookUserInfos(req.token).pipe(
switchMap(user => {
return this._repo.findBy({email: user.email}).pipe(
switchMap(foundUser => {
// assume foundUser is always null
if (!foundUser) {
const fromFacebook = this.createUserModel(user, event.queryStringParameters);
return this._repo.save(fromFacebook);
}
return of(foundUser);
}));
}),
switchMap(user => {
return this.getAuthToken(user)
}),
map(response => Response.ok(response.body, response.headers)),
catchError((err) => of(Response.errorResponse(err)))
);
Я застрял, поскольку он вызывает this._repo.save(fromFacebook) и не ждет завершения наблюдаемого и переходит к следующей карте переключения с другим наблюдаемым. Как я могу заставить блок ждать результата this._repo.save(fromFacebook) перед переходом к следующему? метод сохранения также возвращает наблюдаемое. Заранее спасибо за вашу помощь. Ваше здоровье
@miqh Изначально у меня это было, но если результат findBy равен нулю, я не смогу создать пользователя, так как пользовательская переменная будет вне области видимости
Попробуйте приведенный ниже фрагмент кода.
return this.facebook.getFacebookUserInfos(req.token).pipe(
switchMap(user => {
return this._repo.findBy({email: user.email}).pipe(
switchMap(foundUser => {
// assume foundUser is always null
if (!foundUser) {
const fromFacebook = this.createUserModel(user, event.queryStringParameters);
return this._repo.save(fromFacebook);
} else {
return of(foundUser);
}
}));
}),
concatMap(user => {
return this.getAuthToken(user)
}),
map(response => Response.ok(response.body, response.headers)),
catchError((err) => of(Response.errorResponse(err)))
);
Кроме того, нет необходимости вкладывать ваши самые сокровенные
switchMap
. Если вы структурируете оператор как:switchMap(user => this._repo.findBy(...))
, вы можете вставить внутреннийswitchMap
сразу после него на том же уровне.