Javascript 在可观察对象内异步/等待

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.

如何在可观察对象中使用async/await?? 使用这段代码,我无法在可观察范围内触发unsubscribe函数,因此不会清除间隔

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应将异步函数的结果转换为可观察函数