为什么当我将其转换为Promise时,我的自定义可观察行为会有所不同



我有以下可观察性

callOne() {
return new Observable(subscriber => {
subscriber.next(true);
setTimeout(() => {
subscriber.complete();
}, 3000)
})
}
callTwo() {
return new Observable(subscriber => {
subscriber.next(false);
setTimeout(() => {
subscriber.complete();
}, 1000)
})
}

所以当我打电话给他们订阅时


this.callOne().subscribe(data => {
console.log(data);
})
this.callTwo().subscribe(data => {
console.log(data);
})

即使我在setTimeout中设置了完整的方法,我也会立即打印出true和false。我想说的是,在x miliseconds中,在执行complete方法之后,不能发出新的值。

当我尝试同样的方法时,但这次可观察性被转换为承诺


let response1 = await this.callOne().toPromise();
console.log('response1', response1);
let response2 = await this.callTwo().toPromise();
console.log('response2', response2);

然后我从3000毫秒内可观测到的callOne中得到了true。为什么?

为什么当我有promise时,setTimeout会考虑完整的方法但对于可观察的,它不是吗?

您应该更改代码中的某些内容。您必须在setTimout中运行下一个方法。因为当您运行下一个方法observables触发器时,您还订阅了它将调用的observable。

callOne() {
return new Observable(subscriber => {
setTimeout(() => {
subscriber.next(true); // you can use like this
subscriber.complete(); 
}, 6000)
})
}

但当您使用wait时,它的工作方式与then((类似,并且当一切都完成时,它会调用。

我想,直到subscriber.complete()调用,promise才会解析。由于您使用了await,所以在promise解析之前,执行不会继续。

本文实际上解释了toPromise()返回的promise等待observable完成,然后返回最后一个值:https://levelup.gitconnected.com/rxjs-operator-topromise-waits-for-your-observable-to-complete-e7a002f5dccb

toPromise()已经被弃用了,所以我不想麻烦使用它。你可以把Observables包装在Promises中。然后你可以准确地控制它们何时解决。

callOne() {
const observable = new Observable((subscriber) => {
subscriber.next(true);
setTimeout(() => {
subscriber.complete();
}, 3000);
});
return new Promise((resolve) => {
observable.subscribe((result) => resolve(result));
});
}

这个承诺将在subscriber.next()的第一次通话中得到解决,我相信这正是你所期望的。

请记住,Observables可以重复调用.next(),但Promises只能解析一次。

可观察对象和承诺是不同的东西,即使它们可能会将一个转换为另一个。

你所面临的是意料之中的事。承诺并不是";"解决";直到可观察的完成,所以只有在完成之后,它才会运行逻辑,这就是promise的工作方式。在这个意义上可观察到的是不同的。

事实上,如果你没有完成流,在订阅中你仍然可以运行代码,但在承诺中,由于流永远不会完成,它不会运行任何东西。一个非常常见的错误是将长寿命热可观测值转换为承诺。

最新更新