首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在调用操作之前,将ngrx/effects中的RXJS操作链接到为不同操作调用Firebase的策略

在调用操作之前,将ngrx/effects中的RXJS操作链接到为不同操作调用Firebase的策略
EN

Stack Overflow用户
提问于 2017-01-24 01:33:11
回答 1查看 518关注 0票数 1

我有一个我不知道如何处理的情况。这种情况是长时间拉取Firebase,将一些数据作为可观察的数据返回给ngrx/effects,然后再次调用Firebase删除一些数据,最后将第一个Firebase返回的数据传递给一个Action,以便reducer完成它的工作。

下面是ngrx/effects代码

代码语言:javascript
复制
    constructor(private threadsService: ThreadsService, private store: Store<ApplicationState>) {
    
      }
    
      @Effect() newMessages$ = Observable.interval(5000)
        .withLatestFrom(this.store.select("uiState"))
        .map(([any,uiState]) => uiState)
        .do(console.log)
        .filter(uiState => uiState.userId)
        .switchMap(uiState => this.threadsService.loadNewMessagesForUser(uiState.userId))
        .withLatestFrom(this.store.select("uiState"))
        .do(console.log)
        .switchMap(([messages, uiState]) => this.threadsService.deleteMessagesQueuePerUser(messages, uiState.userId))
        .map(messages => new NewMessagesReceivedAction(messages))

第一个this.threadsService.loadNewMessagesForUser(uiState.userId)将获得我最终需要用于NewMessagesReceivedAction(消息)的Firebase数据。但是在传递message observable之前,我还需要删除MessagesQueuePerUser,这样下一个间隔将返回empty,因为新消息已经被拉出。但是上面的代码不会工作,结果很糟糕,而且有很多错误:

错误#1:在筛选器之前没有.do(console.log),此代码

代码语言:javascript
复制
.filter(uiState => uiState.userId)

将在WebStorm中引发错误-类型“{}”上不存在属性“userId”。)

错误#2:这3行代码不能工作:

代码语言:javascript
复制
  // .withLatestFrom(this.store.select("uiState"))
 // .do(console.log)
 // .switchMap(([messages, uiState]) => this.threadsService.deleteMessagesQueuePerUser(messages, uiState.userId))

这3行的想法是继续向下传递可观察到的消息,但我还需要uiState.userId使用以下命令删除Firebase中的一些数据: this.threadsService.deleteMessagesQueuePerUser(messages,uiState.userId)。但是在第一个Firebase列表中可观察到的消息传递不会进入第二个Firebase列表。下面是threadsService代码:

代码语言:javascript
复制
  firebaseUpdate(dataToSave) {

    const subject = new Subject();

    this.sdkDb.update(dataToSave)
      .then(
        val => {
          subject.next(val);
          subject.complete();
        },
        err => {
          subject.error(err);
          subject.complete();
        }
      );

    return subject.asObservable();
  }

  loadNewMessagesForUser(uid: string): Observable<Message[]> {

    console.log ("We are pulling the server! uid: " + uid);

    return this.findMessagesForMessageKeys(this.findMessageKeysPreUserUnread(uid));

  }

  findMessagesForMessageKeys(messageKeys$:Observable<string[]>): Observable<Message[]> {
return messageKeys$
  .map(pspp => pspp.map(messageKey => this.db.object('message/' + messageKey)))
  .flatMap(fbojs => Observable.combineLatest(fbojs))
   }

  deleteMessagesQueuePerUser(messages:Observable<Message[]>, uid:string): Observable<Message[]> {

    let dataToSave = {};
    dataToSave['MessagesQueuePerUser/' + uid] = null;
    this.firebaseUpdate(dataToSave);
    return messages;
  }

  findMessageKeysPreUserUnread(uid: string):Observable<string[]> {
    return this.db.list('MessagesQueuePerUser/' + uid)
      .map(getKeys => getKeys.map(p => p.$key));
  }

谁能给我指出正确的方向,找出如何组织和编写这篇文章?

更新以澄清。

是的,我有UiState类型的。我真正想要的是从this.threadsService.loadNewMessagesForUser(uiState.userId).获得NewMessages在获得NewMessages之后(因为它是一个可观察的异步操作),我想运行删除操作(更像是副作用中的副作用)。当我触发动作messages(NewMessagesReceivedAction)时,数据应该来自this.threadsService.loadNewMessagesForUser(uiState.userId).希望这件事能澄清一点。

EN

Stack Overflow用户

回答已采纳

发布于 2017-01-24 05:37:32

我假设你有一个UiState类型。

这是一种方法:

代码语言:javascript
复制
@Effect() newMessages$ = Observable.interval(5000)
    .withLatestFrom(this.store.select("uiState"))        
    .map(([any,uiState]) => uiState)
    .filter(uiState => uiState.userId)
    .switchMap(uiState => threadsService.loadNewMessagesForUser(uiState.userId)
      .switchMap(newMessages => threadsService.deleteMessagesQueuePerUser(newMessages, uiState.userId)
      .map(deletedMessages => newMessages)))
    .map(messages => ({ type:'MESSAGES_RECEIVED', payload: messages }));

工作柱塞:https://embed.plnkr.co/BdZOD3XHEXU14GveQUBv/

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41812235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档