当我发出下一个值时等待异步订阅
Wait async subscriptions when I emit next value
我有下一个例子
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
我可以达到预期的行为还是应该使用其他方法?
好的,这应该可以。我只是强制了 Observables 的行为。需要明确的是,可观察对象是异步的 javascript 并且需要在异步模式下共享值,以便您可以通过主题 'emit' 一个新值,并且所有可观察对象都可以在执行其他任务时看到该值。此代码完全按照您的要求执行,但在同一时间和地点发出一个值并等待该值是没有意义的,要实现这一点,您可能应该考虑另一种编码此模块的方法。
我说的是,我已经测试了这个片段并且它有效,希望这会有所帮助
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');
})();
我有下一个例子
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
我可以达到预期的行为还是应该使用其他方法?
好的,这应该可以。我只是强制了 Observables 的行为。需要明确的是,可观察对象是异步的 javascript 并且需要在异步模式下共享值,以便您可以通过主题 'emit' 一个新值,并且所有可观察对象都可以在执行其他任务时看到该值。此代码完全按照您的要求执行,但在同一时间和地点发出一个值并等待该值是没有意义的,要实现这一点,您可能应该考虑另一种编码此模块的方法。
我说的是,我已经测试了这个片段并且它有效,希望这会有所帮助
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');
})();