亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 RxJs 中實現具有固定堆棧的排隊系統

在 RxJs 中實現具有固定堆棧的排隊系統

慕標5832272 2022-10-21 15:01:44
假設我想要一個隊列,其中任何時候只異步處理 3 個項目,我該怎么做?這就是我的意思:如果我有一組項目要上傳到后端,即將一些人工制品上傳到云存儲,然后創建/更新一個文檔以反映每個人工制品的 url,我不想:在下一次之前異步/等待每個上傳操作 - 因為這會很慢同時發送所有內容 - 這可能導致寫入熱點或速率限制做一個 promise.race - 這最終導致(2)做一個 promise.all - 如果有一個長時間運行的上傳,這個過程會變慢。我想做的是:有一個所有上傳的隊列,比如使用 RxJs 創建方法,例如from(array-of-upload-items)在任何時候處理 3 個項目的堆棧。當一個項目離開堆棧即完成時,我們將一個新項目添加到隊列中確保在任何一點,堆棧中始終有 3 個項目正在處理,直到隊列中沒有更多項目等待放入堆棧。我將如何使用 RxJs 來解決這個問題?編輯:2020 年 6 月 27 日這就是我的想法:const rxQueue = from(filesArray) // this is the list of files to upload say like 25 files or so      rxQueue        .pipe(          mergeMap((item) =>            of(item).pipe(              tap(async (item) => {                  await Promise.race([                      processUpload(item[0]),                      processUpload(item[1]),                      processUpload(item[2]),                  ])              }),            ),            3          ),        )        .subscribe()目標是確保在任何時候都處理(上傳)3 個文件,以至于如果一個文件上傳過程結束,則添加另一個文件以將堆棧保持在 3 個上傳過程中。同理,如果 2 個文件上傳同時結束,則將 2 個新文件添加到堆棧中,依此類推,直到文件數組中的所有文件都上傳完畢。
查看完整描述

2 回答

?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

我想你可以試試這個:


from(filesArray)

  .pipe(

    mergeMap(file => service.uploadFile(file), 3)

  )

這假設service.uploadFile返回一個承諾或一個可觀察的。


假設您有 5 個文件,那么將從前 3 個文件創建 3 個可觀察對象,當其中一個完成時,將獲取第 4 個文件并從中創建一個新的可觀察對象,依此類推。


查看完整回答
反對 回復 2022-10-21
?
偶然的你

TA貢獻1841條經驗 獲得超3個贊

用作Subject隊列,并且mergeMap有一個并發參數,您可以限制最大并發數


const queue=new Subject()

queque.asObservable().pipe(mergeMap(item=>httpCall(item),3)

queue.next(item)


查看完整回答
反對 回復 2022-10-21
  • 2 回答
  • 0 關注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號