Javascript 在可观察对象内异步/等待
如何在可观察对象中使用async/await?? 使用这段代码,我无法在可观察范围内触发unsubscribe函数,因此不会清除间隔Javascript 在可观察对象内异步/等待,javascript,rxjs,observable,Javascript,Rxjs,Observable,如何在可观察对象中使用async/await?? 使用这段代码,我无法在可观察范围内触发unsubscribe函数,因此不会清除间隔 const { Observable } = require("rxjs"); const test = () => new Observable(async (subscriber) => { await Promise.resolve(); const a = setInterval(() => { subscriber.
const { Observable } = require("rxjs");
const test = () => new Observable(async (subscriber) => {
await Promise.resolve();
const a = setInterval(() => {
subscriber.next(Math.random());
console.log("zz");
}, 500);
return () => {
console.log("asdsad");
clearInterval(a);
};
});
const xyz = test().subscribe(console.log);
setTimeout(() => {
xyz.unsubscribe();
}, 3000);
首先,传递给可观察构造函数的订户不能是异步函数。没有人支持这一点 如果需要从promise创建observable,请使用
from
:
import { from } from 'rxjs';
const observable = from(promise);
但考虑到你的情况
由于无法取消本机js承诺,您无法真正取消订阅此类创建的observable,因此:
const obs = from(new Promise(resolve => {
setTimeout(() => {
console.log('gonna resolve');
resolve('foo');
}, 1000);
}));
const sub = obs.subscribe(console.log);
setTimeout(() => sub.unsubscribe(), 500);
将打印:
gonna resolve
gonna resolve
gonna resolve
(...)
所以是的:将要解析的
将一直打印在cosole中,但没有其他内容-传递给解析的结果将被忽略-只是不记录
另一方面,如果您这次删除该取消订阅(setTimeout(()=>sub.unsubscribe(),500);
),您将看到:
gonna resolve
foo
gonna resolve
gonna resolve
gonna resolve
(...)
有一种方法可能会帮助你-推迟
——但它与你的问题并不严格相关
import { defer } from 'rxjs';
defer(async () => {
const a = await Promise.resolve(1);
const b = a + await Promise.resolve(2);
return a + b + await Promise.resolve(3);
}).subscribe(x => console.log(x)) // logs 7
Observable.fromPromise应将异步函数的结果转换为可观察函数