几天来,我一直在努力(并搜索)一个解决方案,而在以下工作中,我不禁感到有更多的rxjs-y方法可以实现这一点。
我有一系列URL可供下载,这些URL具有速率限制,每分钟最多不超过100个呼叫。
const sources = ['a.jpg', 'b.jpg', 'c.jpg'];
timer(0, 1000).pipe(
switchMap(index => of(sources[index])),
takeWhile(_ => _ !== undefined),
switchMap(url => {
return from(download(url))
})
).subscribe(
next => console.log(next),
err => console.error(err),
() => console.info('Done')
)
// Pseudo
function download(url) {
return new Promise((resolve, reject) => {
resolve('Downloaded ' + url)
})
}
似乎有点回旋处和黑道。
迭代数组以免被过多请求/秒锁定的最佳方法是什么?
答案 0 :(得分:1)
这取决于您何时需要进行延迟,但是可以使用例如保证1s延迟的示例:
import { from, of, merge as mergeStatic, timer } from 'rxjs';
import { delay, concatMap, merge, ignoreElements } from 'rxjs/operators';
const sources = ['a.jpg', 'b.jpg', 'c.jpg'];
const mockRequest = s => of(s)
from(sources)
.pipe(
concatMap(url => mergeStatic(
mockRequest(url),
timer(1000).pipe(ignoreElements())
))
)
.subscribe(console.log)
或者,如果您想在请求完成后进行延迟(请求时间+延迟),则可以使用mockRequest(url).pipe(delay(1000))
。
如果您要先发出结果然后再进行交易,则只需切换运算符的顺序即可:
from(sources)
.pipe(
concatMap(url => mockRequest(url).pipe(
merge(timer(1000).pipe(ignoreElements()))
))
)
.subscribe(console.log)
实时演示:https://stackblitz.com/edit/rxjs6-demo-qwdfgp?file=index.ts