Объединить обещание с наблюдаемым - PullRequest
0 голосов
/ 05 июля 2018

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

import { Injectable } from '@angular/core'; (...)

@Injectable({ providedIn: 'root', })
export class IssueService {
    private users!: Promise<Map<number, Users>;
    constructor(private http: HttpClient, private userService: UserService) {
        this.users = this.userService.getUsers()
    }

    getIssues() {
        return this.users.then(users => {
            return this.http.get<Iissue[]>(URL, OPTIONS).pipe(
                map(issues => new Issue(issue, users)),
            );
        });
    }
}

Ответы [ 3 ]

0 голосов
/ 06 июля 2018

@ Уондрилл показал, как получить наблюдаемое из обещания.

Вы также можете использовать "from ()", который также должен работать с Promises. Теперь вы можете использовать всю магию rxjs.

В вашем случае вы хотите переключиться с одного потока (обещание) на другой поток (htt.get). Поэтому я использовал бы «switchMap», а после этого «map», чтобы получить дату в желаемом формате.

getIssues():Observable<Issue>{
    return from(this.users).pipe(
        switchMap((users:Map<number, Users>) => this.http.get(URL,OPTIONS) ),
        map( (issues: IIssue[]): Issue => new Issue(issue,users) )
    )
}

С уважением

0 голосов
/ 06 июля 2018

Самый простой подход - заключить обещание в Observable.from(), чтобы оно соответствовало интерфейсу Observable. Но это не меняет его жар / холод и может привести к неожиданному поведению.

Наблюдаемые объекты ( по умолчанию ) ленивы и начнут работать только после того, как вы на них подпишетесь. Обещания нетерпеливы и начнут выполняться немедленно. Это может привести к сложным условиям отладки, потому что ваше обещание-наблюдение может выполняться и завершиться за пределами вашей наблюдаемой.

Для решения этой проблемы вы можете использовать Observable.defer(() => myPromise()), поэтому ваше обещание будет выполнено (и начнется) только после подписки на Observable.defer.

0 голосов
/ 05 июля 2018

функция, как это будет работать:

getIssues() {
  return mergeMap(val =>
    fromPromise(myPromise(val))
  )
}
...