Search code examples
meteortypescriptangularrxjs5angular2-meteor

How to return to the function level?


I have a function loadMessages, I want it return an Observable.

  loadMessages(chatId: string): Observable<Message[]> {
    console.log('1');

    this.autorun(() => {
      const handle = this.subscribe('messages', chatId);

      if (handle.ready()) {
        console.log('2');

        const messages = Messages.find().fetch();
        return Observable.of(messages);  // here return is not for this function, which is useless
      }
    });

    console.log('3');  // I don't want this line run immediately

    // I wish I can return here, but I cannot
  }

How can I return to the function level?

Also, right now the order is 1 -> 3 -> 2. Is there any way to run 1 -> 2, and wait there until I get the data?


Solution

  • You can try something like this:

    loadMessages(chatId: string): Observable<Message[]> {
      console.log('1');
    
      return Observable.create(observer => {
        this.autorun(() => {
          const handle = this.subscribe('messages', chatId);
    
          if (handle.ready()) {
            console.log('2');
    
            const messages = Messages.find().fetch();
            observer.next(messages)
          }
        });
      });
    }
    

    Very simple example is here http://plnkr.co/edit/GADtB8QCTnNubtRu9SFv?p=preview