3 回答

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超8個(gè)贊
只需使用范圍運(yùn)算符,它接受兩個(gè)參數(shù);start & count(?range(start: number, count: number): Observable
) 并返回一個(gè) Observable,該 Observable 發(fā)出一系列數(shù)字,您可以根據(jù)需要對(duì)其進(jìn)行轉(zhuǎn)換。
考慮以下示例:
interface Body {
? name: string
}
class Component {
? constructor(
? ? private alertify: Alertify,
? ? private cvmService: CvmService
? ) { }
? public addMany(count: number, base: string): void {
? ? return range(1, count).pipe(
? ? ?/**
? ? ? * transform each emitted number into a @Body
? ? ? */
? ? ? map(number => {?
? ? ? ? const body: Body = { name: `${base}${number}` };
? ? ? ? return body;
? ? ? }),
? ? ? toArray(), // <-- collect emitted values
? ? ?/**
? ? ? * transform the array of @Body[] returned by @toArray() into an?
? ? ? * array of Observables and use @forkJoik operator to wait for all
? ? ? * Observables to complete
? ? ? */
? ? ? switchMap(array => forkJoin(array.map(body => this.addOne(body))))
? ? ).subscribe(() => console.log("done!"))
? }
? /**
? * transform each body into an Observable?
? * without subscribing to it
? * use @tap operator to listen for events that will be raised
? * by future subscriptions
? */
? public addOne(body: Body): Observable<void> {
? ? return this.cvmService.createServer(body)
? ? ? .pipe(
? ? ? ? tap({
? ? ? ? ? next: () => this.alertify.success('New item was successfully created'),
? ? ? ? ? error: error => this.alertify.error('\n' + error)
? ? ? ? })
? ? ? )
? }
}

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊
生成是你的朋友:
const baseName = this.createItemForm.get('name').value + '-';
generate(1, x => x <= this.count, x => ++x).pipe(
? map(val => baseName + val),
).subscribe(bodyName => {
?// do something with your worker-1 .... worker-count
});
generate將生成從 1 到您的輸入計(jì)數(shù)的序列。
map只會(huì)將您的前綴(例如“worker”)與要生成的數(shù)字連接起來bodyName。
...然后就取決于你了。從代碼中尚不清楚您的 body 對(duì)象是什么樣子,您想要對(duì)每個(gè)請(qǐng)求執(zhí)行什么操作以及最終執(zhí)行什么操作。

TA貢獻(xiàn)1844條經(jīng)驗(yàn) 獲得超8個(gè)贊
嘗試這個(gè)。例如 :
forkJoin([res1, res2, res3, res4, res5])
.pipe(map(data => data.reduce((result,arr)=>[...result,...arr],[])))
.subscribe(data =>{
this.autoCompleteValues = data;
console.log(this.autoCompleteValues);
});

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超7個(gè)贊
mergeMap將值轉(zhuǎn)換為訂閱的可觀察量
mergeMap(value => observable) 將為您訂閱并發(fā)出映射的可觀察值的值??雌饋砟枰闹皇?mergeMap(body => service(body)) ,然后您就可以開始比賽了。
以下是您使用 RxJS 所做的事情的非常直接的翻譯。如果你的代碼有效,那么(理論上,我無法測(cè)試它)這個(gè)或非常類似的東西應(yīng)該可以工作。
我不確定body您的示例中定義的位置,因此我假設(shè)它是一個(gè)具有某些屬性的對(duì)象,并且您要向其添加另一個(gè)屬性 ( name)
addItems(){
range(1, this.count).pipe(
map(i => ({
...body,
name: `${this.createItemForm.get('name').value}-${i}`
})),
mergeMap(body => this.cvmService.createServer(body))
).subscribe({
next: resp => {
this.alertify.success('New item was successfully created');
this.close(true);
},
error: err => this.alertify.error('\n' + err),
complete: () => console.log(`${this.count} items where succesfully created`)
});
}
forkJoin將可觀察數(shù)組轉(zhuǎn)換為響應(yīng)數(shù)組
可以做同樣的事情forkJoin,因?yàn)榭雌饋砟姆?wù)調(diào)用發(fā)出一次并完成。
在這里,您首先需要?jiǎng)?chuàng)建所需的服務(wù)調(diào)用的數(shù)組。我通過將數(shù)組映射[1,2,3,4,5]到主體對(duì)象[{name:worker-1},{name:worker-2},{name:worker-3},{name:worker-4},{name:worker-5}],然后將主體對(duì)象映射到服務(wù)調(diào)用來實(shí)現(xiàn)此目的[observable,observable,observable,observable,observable]。
所有這些都是在沒有任何 RxJS 的情況下完成的,RxJS 部分是forkJoin([observable,observable,...]). 它訂閱每個(gè)可觀察對(duì)象并等待它們?nèi)客瓿伞?/p>
不同之處在于 forkJoin 將以數(shù)組形式發(fā)出最終結(jié)果。如果您仍然想要針對(duì)每個(gè)結(jié)果發(fā)出警報(bào)并調(diào)用 this.close(true),那么我們需要檢測(cè)每個(gè)服務(wù)調(diào)用(數(shù)組中的源可觀察對(duì)象)來執(zhí)行此操作。
當(dāng)您訂閱時(shí),next回調(diào)將被給予一個(gè)數(shù)組。實(shí)現(xiàn)如下所示:
addItems(){
forkJoin(
Array.from(
{length: this.count},
(_,i) => i+1
).map(i => ({
...body,
name: `${this.createItemForm.get('name').value}-${i}`
})).map(body =>
this.cvmService.createServer(body).pipe(
tap(_ => {
this.alertify.success('New item was successfully created');
this.close(true);
})
)
)
).subscribe({
next: resp => {
console.log(`${resp.length} items where succesfully created`);
},
error: err => this.alertify.error('\n' + err)
});
}
添加回答
舉報(bào)