Javascript RXJS:从承诺创建的连接观察对象的非顺序行为

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

假设我有一个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(() => {
      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(...)