Javascript RXJS:从承诺创建的连接观察对象的非顺序行为
假设我有一个TS代码:Javascript RXJS:从承诺创建的连接观察对象的非顺序行为,javascript,rxjs,Javascript,Rxjs,假设我有一个TS代码: import { concat, from, of } from 'rxjs'; import { mergeMap } from 'rxjs/operators'; const promise = (i: number) => new Promise<number>((resolve) => { const delay = Math.floor(Math.random() * 1000); setTimeout(() =&g
import { concat, from, of } from 'rxjs';
import { mergeMap } from 'rxjs/operators';
const promise = (i: number) =>
new Promise<number>((resolve) => {
const delay = Math.floor(Math.random() * 1000);
setTimeout(() => {
console.log(`promise ${i}`);
resolve(i);
}, delay);
});
const observable = (i: number) => {
return from(promise(i)).pipe(mergeMap((j) => of(j)));
};
const obs = [];
for (let i = 0; i <= 5; i++) {
obs.push(observable(i));
}
concat(...obs).subscribe({
next: (l) => console.log(`result ${l}`),
complete: () => console.log('done'),
});
但实际上我得到了一些典型的异步行为,如:
promise 2
promise 4
promise 0
result 0
promise 3
promise 5
promise 1
result 1
result 2
...
done
这让我想到,所有潜在的承诺都是预先一次运行的,然后相应的结果按顺序合并。有没有办法防止这种行为并获得预期的结果
编辑:我真正需要的是,每个承诺只有在前一个观察者完成后才开始,而不是所有承诺都立即开始
提前谢谢你 这对你想要实现的目标有用吗? 从“rxjs/operators”导入{mergeMap,delay}; 从(promise(i)).pipe(delay(Math.floor(Math.random()*1000))、mergeMap((j)=>of(j))返回; 使用替换超时。 好的,对不起,我误解了。 这有点类似 下面的示例将仅在第一个承诺完成并解析后调用每个承诺。我认为concat可能在到达上面示例中的concatMap()之前就执行了每个承诺。 from([0,1,2,3,4]).pipe(concatMap(i=>from(promise(i)))。订阅({ 下一步:(l)=>console.log(
result${l}
),
完成:()=>console.log('done'),
}); 承诺立即启动,与可观察的不同,因此问题在于您的
可观察的
函数调用了已经启动它的承诺
。您可以通过延迟解决此问题:
defer(() => from(promise(i))).pipe(...)
谢谢你的回复!,这很可能会奏效,但我真正需要的是,每个承诺都在前一个观察者完成后开始,而不是所有承诺都立即开始。
defer(() => from(promise(i))).pipe(...)