将Promise的结果转换为Observable的桥接方式

3

如果我问了一个愚蠢的问题,请提前道歉。我进行了搜索,但没有找到我要找的答案。

我需要将 Promise 返回的 index 值作为参数传递给我的 Observable:

deleteFavorite(token: string, recipe: Recipe) {

const userId = this.authService.getActiveUser().uid;
let index: number;

this.indexOfFavoriteToBeRemoved(recipe)
  .then(
    index => {
      console.log(index)
    }
  );

return this.http.delete(this.databaseAddress + userId + '/' + index + '.json?auth=' + token)
  .map(
    (response: Response) => {
      return response.json();
    }
  );
}
1个回答

3

将 Promise 转换为 Observable,然后使用 flatMap 来连接这些 Observable,并返回一个 Observable。

import { Observable } from "rxjs/Observable";
import 'rxjs/add/observable/fromPromise';
import 'rxjs/add/operator/flatMap';
import 'rxjs/add/operator/map';
...
deleteFavorite(token: string, recipe: Recipe): Observable<any> {
    const userId = this.authService.getActiveUser().uid;
    return Observable.fromPromise(this.indexOfFavoriteToBeRemoved(recipe))
        .flatMap(index => this.http.delete(this.databaseAddress + userId + '/' + index + '.json?auth=' + token))
}

或者将可观察对象转换为Promise,使用.then链接这些Promise,并且您可以返回一个Promise。

import 'rxjs/add/operator/toPromise';
import 'rxjs/add/operator/map';
...
deleteFavorite(token: string, recipe: Recipe): Promise<any> {
    const userId = this.authService.getActiveUser().uid;
    return this.indexOfFavoriteToBeRemoved(recipe)
      .then( index => this.http.delete(this.databaseAddress + userId + '/' + index + '.json?auth=' + token)
          .map(
            (response: Response) => {
              return response.json();
            }
          ).toPromise()
      )
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接