rxjs - 如何创建一个类似于 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)
为什么会发生这种情况?我究竟做错了什么?
解决方案
首先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()
。
推荐阅读
- javascript - 在顶点图表中使用变量作为数据
- laravel - 没有认证的新 laravel 项目
- git - 从 git 安装并执行 rpy2
- php - 尝试在 laravel 中使用自定义字段“user_id”登录
- laravel - 将关系数据直接附加到模型
- c++ - 类变量的值神秘地变化
- javascript - 使用 React 和 Google App 脚本将文件上传到 Google Drive
- html - 我怎样才能为圆桌标题圆角?
- apache-spark - Spark 的 HDFS I/O 架构与 S3 有何不同?
- javascript - 使用节点和猫鼬插入依赖于另一个的文档