簡體   English   中英

我如何等待直到RxJS中的所有Promise都實現了?

[英]How do I wait until all the Promises are fulfilled in RxJS?

我有一個要獲取結果並顯示在頁面上的承諾列表。

 let directives = ['object-src', 'img-src', 'media-src', 'script-src', 'style-src', 'frame-src', 'child-src'];

 let directivesStream = Rx.Observable.from(directives)
   .map((d) => {
     let q = getSummaryCSP({
       origin: origin,
         directive: d,
         from: moment().subtract(3, 'days').utc().format(),
         to: moment().utc().format()
     });

     return Rx.Observable.interval(10000)
       .flatMap(() => Rx.Observable.fromPromise(queries.query(q)));
   });

 directivesStream.mergeAll().subscribe((response) => {
   let flattenedRes = _.sortBy(response.data, (e) => e.event.count);
   flattenedRes = _.reverse(flattenedRes);
   this.setState({
     cspReport: flattenedRes
   });
 });

因此,它正在做的是創建間隔為10000的Promises流。 但是,最終結果是所有promise的合並結果,這就是為什么我要進行sortingreversing ,然后在React中顯示結果。

我知道RxJs中的所有內容都是流。 因此,我不確定是否可以完全做到這一點?

因此,我的問題是我如何創建一個Promises流,在10年代末,所有流都必須合並為一個流,這樣我才能使用所有Promise的結果。

不知道我是否很好地理解了您的問題,但以下是一些指導您進行調查的指示:

  • toArray運算符:允許將流的所有發射聚集到一個數組中
  • forkJoin運算符:等同於Promise.all ,並行運行所有promise並收集所有結果

我相信,只要使用這兩個之一,就可以實現您的目標。 我讓您找出嘗試自己解決問題的最佳方法是對Rxjs的深入了解。 您還可以在此處找到操作員列表。 我建議您在發布問題之前先看一下。

因為您可以在React中將節點模塊導入到客戶端代碼中,所以我來看看Async節點模塊。 我相信您要執行的執行過程是地圖和瀑布的結合。

async.waterfall([
    myFirstFunction,
    mySecondFunction,
    myLastFunction,
], function (err, result) {
    // result now equals 'done'
});
function myFirstFunction(callback) {
    callback(null, 'one', 'two');
}
function mySecondFunction(arg1, arg2, callback) {
    // arg1 now equals 'one' and arg2 now equals 'two'
    callback(null, 'three');
}
function myLastFunction(arg1, callback) {
    // arg1 now equals 'three'
    callback(null, 'done');
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM