【问题标题】:How to use observable with promise and return observable如何通过 promise 使用 observable 并返回 observable
【发布时间】:2018-06-11 18:37:51
【问题描述】:

我有这个功能可以将文档添加到 Firestore 集合中。

addListing(listing: Listing) {
    return this.auth.user$.pipe(
      first(),
      map(user => user.uid),
      map(uid => {
        const listingId = this.afs.createId();

        this.listingsCollection.doc(listingId).set(listing);

        return listingId;
      })
    );
  }

这个函数应该像现在一样返回一个 listingId 的 observable。

但是我不确定是否应该在 ...set(listing).then() 中返回 listingId,因为当列表不会被“设置”或发生任何错误时,我不会返回 listingId,而是返回其他内容。

我已经尝试过看看情况如何:

addListing3(listing: Listing) {
    return this.auth.user$.pipe(
      first(),
      map(user => user.uid),
      map(uid => {
        const listingId = this.afs.createId();

        this.listingsCollection
          .doc(listingId)
          .set(listing)
          .then(() => {
            return listingId;
          })
          .catch(error => console.error);
      })
    );
  }

问题是老实说我不确定如何将 promise 与 observable 一起使用。

第一种方法返回字符串的 Observable

秒方法返回 void 的 Observable

【问题讨论】:

    标签: angular rxjs angularfire2


    【解决方案1】:

    您实际上可以返回 Promise 并使用 mergeMap 将其合并到 Observable 流中:

    addListing3(listing: Listing): Observable<string> {
        return this.auth.user$.pipe(
          first(),
          map(user => user.uid),
          mergeMap(uid => {
            const listingId = this.afs.createId();
    
            return this.listingsCollection
              .doc(listingId)
              .set(listing)
              .then(() => {
                return listingId;
              })
              .catch(error => console.error);
          })
        );
      }
    

    【讨论】:

    • 我实际上设法以其他方式做到了。 return from(promise).pipe( map(() =&gt; listingId), catchError(error =&gt; of(error)) ); 其中promise 只是this.listingsCollection.doc(listingId).set(listing),我可以更好地处理错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    相关资源
    最近更新 更多