【问题标题】:Wait async subscriptions when I emit next value当我发出下一个值时等待异步订阅
【发布时间】:2021-12-01 09:13:59
【问题描述】:

我有下一个例子

import { Subject } from "rxjs";

const subject = new Subject();

subject.subscribe(() => new Promise(res => {
  setTimeout(() => console.log('!! 1'), 500);
}))

subject.subscribe(() => new Promise(res => {
  setTimeout(() => console.log('!! 2'), 1000);
}))

console.log('>>> START')
subject.next();
console.log('<<< FINISH')

控制台看起来像

>>> START
<<< FINISH
!! 1
!! 2

我想要以下行为

>>> START
!! 1
!! 2
<<< FINISH

我可以达到预期的行为还是应该使用其他方法?

【问题讨论】:

  • 你可以使用toPromise()方法,但是只有subscribe方法中的回调函数会被执行,因为它是asynchronous,它会被放入队列中并且不会被立即执行
  • 使用.next() 时,您无法控制这将触发哪些异步事件,因此您无法等待它。在这里很难给出任何建议,您必须完全重构此示例以使其达到您的预期。
  • 也许通过使用计划方法?它可以提供类似的功能吗?

标签: rxjs subject


【解决方案1】:

好的,这应该可以。我只是强迫 Observables 的行为。需要明确的是,observables 是异步 javascript,需要在异步模式下共享值,以便您可以通过主题“发出”新值,并且所有 observables 都可以在执行其他一些任务时看到该值。这段代码完全按照你的要求做,但是发出一个值并在同一个地方和时刻等待那个值是没有意义的,为了实现这一点,你可能应该考虑另一种编码这个模块的方式。

说的是,我已经测试过这个 sn-p 并且它可以工作,希望这会有所帮助

import { Subject } from "rxjs";
const subject = new Subject();

async function nextValue(value) {
    return new Promise((resolve, reject) => {
        subject.subscribe(subValue => {
            setTimeout(() => {
                 console.log(subValue);
                 resolve();
            }, 500);
        }, err => reject(err));
        subject.next(value);
    });
}    

(async () => {
    console.log('>>> START');
    await nextValue('myValue');
    console.log('<<< FINISH');
})();

【讨论】:

  • 它可以解决我的部分任务,谢谢!
猜你喜欢
  • 2022-12-20
  • 2021-05-06
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
相关资源
最近更新 更多