我想知道如何在RxJS中获得类似下面的东西。
看起来 switchMap 无法正常工作。因为每个下一个启动的请求在响应之前取消之前的请求。请参阅下面的代码。
let counter = 0;
let times = [1200, 500];
let getSomePromise = function() {
return new Promise((resolve) => {
let i = counter;
counter++;
if (i < 2) {
console.log('promise ' + i + ' start');
}
setTimeout(() => {
if (i < 2) {
console.log('promise ' + i + ' finish');
resolve(i);
}
}, times[i]);
});
}
let ob = Rx.Observable.interval(1000)
.switchMap(() => {
return getSomePromise();
});
let sub = ob.subscribe((value) => {
console.log('result ' + value);
});
<script src="https://unpkg.com/@reactivex/rxjs@5.0.3/dist/global/Rx.js"></script>
我明白了:
promise 0 start
promise 1 start
promise 0 finish
promise 1 finish
result 1
我想:
promise 0 start
promise 1 start
promise 0 finish
result 0
promise 1 finish
result 1
谢谢。
答案 0 :(得分:2)
您可以使用mergeMap()
运算符来获得所需的结果。此运算符订阅从其投影函数返回的所有内部Observable,并重新发出所有项目。
但是,据我了解你的问题,你真的想要使用switchMap()
(第3点确切地描述了switchMap
的作用),但你的预期输出看起来像你想要{{1} }。
查看更新的代码及其输出:
mergeMap()
&#13;
let counter = 0;
let times = [1200, 500];
let getSomePromise = function() {
return new Promise((resolve) => {
let i = counter;
counter++;
if (i < 2) {
console.log('promise ' + i + ' start');
}
setTimeout(() => {
if (i < 2) {
console.log('promise ' + i + ' finish');
resolve(i);
}
}, times[i]);
});
}
let ob = Rx.Observable.interval(1000)
.mergeMap(() => {
return getSomePromise();
});
let sub = ob.subscribe((value) => {
console.log('result ' + value);
});
&#13;
答案 1 :(得分:0)
您正在寻找.switchMap
运营商。
Rx.Observable.interval(1000)
.switchMap(() => Rx.Observable.ajax(someUrl))
.subscribe(val => console.log(val));