Rxjs 如何创建一个类似于使用observable.create延迟返回的observable?
我试图创建一个行为类似于Rxjs 如何创建一个类似于使用observable.create延迟返回的observable?,rxjs,observable,rxjs6,Rxjs,Observable,Rxjs6,我试图创建一个行为类似于defer返回的可观察对象,但使用create方法。所以我试着: const obs = Observable.create(function(observer) { from(fetch('https://jsonplaceholder.typicode.com/todos/1').then(console.log('fetch done'))).subscribe(observer) }) setTimeout(()=>obs.subscribe((re
defer
返回的可观察对象,但使用create
方法。所以我试着:
const obs = Observable.create(function(observer) {
from(fetch('https://jsonplaceholder.typicode.com/todos/1').then(console.log('fetch done'))).subscribe(observer)
})
setTimeout(()=>obs.subscribe((resp)=>console.log(resp.statusText)), 5000)
但当我在节点中运行它时,它只打印“fetchdone”(订阅时,如预期的5秒后),但会一直在那里等待
当我在setImmediate()
或setTimeout(,0)
中包装来自(…)
的时,有时它会打印两条消息(“Fetch done”,“OK”)并退出,有时它只打印“Fetch done”并永远等待。
代码:
为什么会发生这种情况?我做错了什么?第一件事是可观察。create
已被弃用,您应该只使用新可观察()
在创建这样的观察对象时,您可以访问observer
对象,在该对象中可以调用next()
和complete()
,因此在您的情况下如下所示:
new Observable(observer => {
fetch('https://jsonplaceholder.typicode.com/todos/1').then(response => {
observer.next(response);
observer.complete();
});
});
我认为这也应该奏效:
new Observable(observer => {
const sub = from(fetch('https://jsonplaceholder.typicode.com/todos/1')).subscribe(observer);
// Return tear-down function so you can abort request.
return () => sub.unsubscribe();
});
显然,这太复杂了,如果你只想用Observable包装一个承诺,你可以只使用from()
承诺。然后接受一个回调函数,你需要返回参数来链接它,所以它变成然后(result=>{console.log('fetch done',result);return result;})
,这是正确的!修复此问题后,无需使用setTimeout
/setImmediate
。
new Observable(observer => {
const sub = from(fetch('https://jsonplaceholder.typicode.com/todos/1')).subscribe(observer);
// Return tear-down function so you can abort request.
return () => sub.unsubscribe();
});