我的函数对一个观察者进行了一些调用,我不想让函数返回,直到一切都完成。我尝试将返回放在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
}
答案 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
}
});
}
}
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