第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

使用 rxjs 以角度發(fā)送多個(gè)發(fā)布請(qǐng)求

使用 rxjs 以角度發(fā)送多個(gè)發(fā)布請(qǐng)求

智慧大石 2023-11-11 21:20:17
我有一個(gè)表單,我將姓名作為輸入和計(jì)數(shù)(數(shù)字)。我想將號(hào)碼附加到姓名上。例如。如果用戶輸入worker并計(jì)數(shù)5。我想附加從1開始直到計(jì)數(shù)即5的數(shù)字,它將類似于worker-1、worker-2、worker-3、worker-4、worker-5。然后我想向服務(wù)器發(fā)送多個(gè)請(qǐng)求以將這些工作人員添加到數(shù)據(jù)庫(kù)中。我目前正在做這樣的事情。addItems() {    for (let i = 1; i <= this.count; i++) {        body.name = this.createItemForm.get('name').value + '-' + i;        this.add(body);      } }add(body: formBody) {    this.cvmService.createServer(body).subscribe(() => {      this.alertify.success('New item was successfully created');      this.close(true);    }, error => {      this.alertify.error('\n' + error);    });  }我的問題是如何使用 rxjs 來做到這一點(diǎn)以及哪個(gè)是最好的操作員。特別是我在 for 循環(huán)中調(diào)用 add() 的部分,有更好的方法嗎?
查看完整描述

3 回答

?
慕的地10843

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)

? ? ? ? })

? ? ? )

? }

}


查看完整回答
反對(duì) 回復(fù) 2023-11-11
?
墨色風(fēng)雨

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í)行什么操作。


查看完整回答
反對(duì) 回復(fù) 2023-11-11
?
婷婷同學(xué)_

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);

});


查看完整回答
反對(duì) 回復(fù) 2023-11-11
?
qq_笑_17

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)

  });

  

}


查看完整回答
反對(duì) 回復(fù) 2023-11-11
  • 3 回答
  • 0 關(guān)注
  • 279 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)