想要返回内部函数,但它返回而不运行

时间:2016-12-10 01:33:14

标签: angular typescript observable

我的函数对一个观察者进行了一些调用,我不想让函数返回,直到一切都完成。我尝试将返回放在subscribe中,但是当我调用该函数时,我得到一个错误,因为它的类型为void而没有返回是最后一件事。

 ReadyQ(){
    var isReady;
    this.Room.subscribe(snapshot => {
      if(snapshot.Ready=="true"){ 
         console.log("Ready");
         isReady =true;
      }else{
        console.log("Not Ready");
        isReady = false;
      }
  });
  console.log('ISREADY?',isReady}); //undefined
  return isReady;  //returns undefined
}

3 个答案:

答案 0 :(得分:3)

使用toPromise将observable转换为承诺,然后消费者将挂起then

ReadyQ(){
    return this.Room.toPromise().then(snapshot => snapshot.Ready === "true");
}

// consumer
this.ReadyQ().then(ready => console.log("ready is", ready));

这假设observable发出单个快照值。

答案 1 :(得分:2)

我不确定,但看起来Room是一个可观察的(rxjs)。 Observable是异步数据流。您需要使用允许您等待异步代码的东西。

有很多方法可以做到这一点:

回调

class X {

    room: any; // Room is an "observable" ?

    readyQ(cb) {
        this.room.subscribe(snapshot => {
            if(snapshot.Ready == "true"){ 
                cb(true);
            } else {
                cb(false);
            }
        });
    }

    doSomething() {
        this.readyQ((isReady) => {
            if (isReady) {
                // ... do something
            }
        });
    }
}

无极

class X {

    room: any; // Room is an "observable" ?

    readyQ(){
        return new Promise((resolve, reject) => {
            this.room.subscribe(snapshot => {
                if(snapshot.Ready == "true"){ 
                    resolve(true);
                } else {
                    resolve(false);
                }
            });
        });
    }

    doSomething() {
        this.readyQ().then((isReady) => {
            if (isReady) {
                // ... do something
            }
        });
    }
}

Async / await

class X {

    room: any; // Room is an "observable" ?

    readyQ() {
        return new Promise((resolve, reject) => {
            this.room.subscribe(snapshot => {
                if(snapshot.Ready == "true"){ 
                    resolve(true);
                } else {
                    resolve(false);
                }
            });
        });
    }

    async doSomething() {
        var isReady = await this.readyQ();
        if (isReady) {
            // ... do something
        }
    }
}

Async / await是一种看起来更像原始同步示例的方式。

答案 2 :(得分:1)

由于<zoo> <CATS> <cat/> <cat/> <cat/> </CATS> </zoo> 是一个异步的可观察对象,所以在承诺中包含订阅没有多大意义,除非您想要更改或扩充其返回值:

Room