Как связать результат наблюдаемого с нижним наблюдаемым в rxjs - PullRequest
1 голос
/ 29 мая 2019

Я сохраняю пользователя в базе данных.

Вот шаги, за которыми я следую

1) Подтверждение запроса.

2) хеширование пароля.

3) затем сохранение пользовательских данных в коллекции пользователей с хешированным паролем.

Итак, ниже у меня есть код, в котором я подписываюсь на метод hashPassword, как только я получаю хеш-строку, создавая пользователя с хеш-строкой. подписка на метод save и присвоение результата следующему методу наблюдателя.

Как мне сделать этот оператор zip() или map() вместо подписки снова и снова.

createUser(req: Request, res: Response): Observable<mongoose.Document> {
    const body = req.body
    const self = this

    return singleObservable(Observable.create((observer: Observer<mongoose.Document>) => {
        const errorMessage = new UserValidator(req).validateRequest()
        if (errorMessage) {
            observer.error(errorMessage)
        } else {
            self.hashPassword(req.body.password).subscribe(new BaseObserver(
                (value) => {
                    const newUser = new this.userModule({ email: req.body.email, username: req.body.username, password: value })
                    this.save(newUser).subscribe(new BaseObserver((value) => {
                        observer.next(value)
                    }, (err) => {
                        observer.error(err)
                    }))
                }, (error) => observer.error(error)))
        }
    }))
}

private hashPassword(password: string): Observable<string> {
    return singleObservable(Observable.create((observer: Observer<string>) => {
        bcrypt.hash(password, 10, (err, result) => {
            result.length > 0 ? observer.next(result) : observer.error(err)
        })
    }))
}

save<T extends mongoose.Document>(model: mongoose.Document): Observable<T> {
    return singleObservable(Observable.create(function (observer: Observer<mongoose.Document>) {
        model.save(function (err, object) {
            emitResult(observer, object, err)
        })
    }))
}

emitResult<T, E>(observer: Observer<T>, result: T | null, err: E) {
    result ? observer.next(result) : observer.error(err);
}

singleObservable<T>(observable: Observable<T>) : Observable<T> {
    return observable.pipe(first())
}

1 Ответ

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

Я решил свою проблему, используя flatMap оператор

createUser(req: Request, res: Response): Observable<mongoose.Document> {
    const body = req.body
    const self = this

    const errorMessage = new UserValidator(req).validateRequest()
    if (errorMessage) {
        return throwError(errorMessage)
    } else {
        return self.hashPassword(req.body.password).pipe(flatMap((hashedString) => {
            const newUser = new this.userModule({ email: req.body.email, username: req.body.username, password: hashedString })
            return this.save(newUser)
        }), catchError((err) => throwError(err))
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...