我想使用此代码发送请求(我也尝试过forkJoin),并且在调用之间有延迟:
duplicateElement(id: string): Observable
但.pipe(延迟(1000)无法正常工作:1000毫升后发送每个http请求.
最佳答案
现在两个选择!
基本设置
import * as rx from "rxjs";
import * as rxop from "rxjs/operators";
const startTime = new Date();
function getTimestamp() {
return (new Date().getTime() - startTime.getTime()) / 1000;
}
const desiredDelay = 750;
const serviceDelay = 500;
// simulating service,you can ignore what's inside
var myService = (b: any) => {
return rx.of(Math.random()).pipe(
// To simulate long running service
rxop.delay(serviceDelay),// Log the timestap after execution,should be ~ desiredDelay + serviceDelay,so by default 1250ms each emitted value
rxop.tap(() => console.log(`${b} after service result,${getTimestamp()}`)),// simulating the result
rxop.map(a => "result" + b)
);
};
延迟后逐个发出值,执行服务并尽快收集结果
of([1,2,3,4,5])
.pipe(
// See the initial values
tap(console.log),// Split array into single values during emit
// Collect observables and subscribe to next when prevIoUs completes
concatAll(),// Emit each value as a sequence of observables with a desired delay
concatMap(a => of(a).pipe(delay(desiredDelay))),// Call service on each value as soon as possible,do not care about the order
mergeMap(a => myService(a)),// Reduce single values back into array
// Reduces the values from source observable to a single value that's emitted when the source completes
reduce
of([1,// Call the service
// Map values to inner observable,subscribe and emit in order
concatMap(a => myService(a).pipe(delay(desiredDelay))),not necessary
tap(console.log)
)
.subscribe();