首页 > 解决方案 > 如何创建一个类似于 defer 使用 Observable.create 返回的 observable?

问题描述

我正在尝试创建一个行为类似于返回的可观察对象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)

但是当我在其中运行它时,node它只会打印“获取完成”(订阅时,按预期在 5 秒后),但会永远等待。

当我包装from(..)in setImmediate()orsetTimeout(,0)时,有时它会打印两条消息(“Fetch done”,“OK”)并退出,有时它只打印“fetch done”并永远等待。

代码:

const obs = Observable.create(function(observer) {
    setTimeout(()=>from(fetch('https://jsonplaceholder.typicode.com/todos/1').then(console.log('fetch done'))).subscribe(observer), 0)
})

setTimeout(()=>obs.subscribe((resp)=>console.log(resp.statusText)), 5000)

为什么会发生这种情况?我究竟做错了什么?

标签: rxjsobservablerxjs6

解决方案


首先Observable.create是不推荐使用的,你应该只使用new Observable()

当像这样创建 Observables 时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 包装一个 Promise,你可以使用 just from()


推荐阅读