簡體   English   中英

rxjs中do和subscribe之間的區別

[英]Difference between do and subscribe in rxjs

在這個JS Bin中,我有一些可加載模擬的分頁數據源的observable。 getPageFromServer從給定索引開始從服務器加載一頁數據:

function getPageFromServer( index ) {

  index = index || 0;

  var values = [];
  var nextIndex;

  for(var i = 0; i< 3; i++) {
    var newValue = index + i;
    if(newValue < 10){
      values.push( newValue );
      nextIndex = newValue + 1;
    }
    else {
      nextIndex = undefined;
    }
  }

  data = { values: values, nextIndex: nextIndex };

  return Rx.Observable.return(data).delay(500);
}

然后getPagedItems加載頁面並將多個observable連接成一個,這樣我們就可以獲得所有頁面中所有值的可觀察值:

function getPagedItems(index) {
  return getPageFromServer(index)
    .flatMap(function (response) {
      var result = Rx.Observable.from(response.values);

      if(response.nextIndex !== undefined){
        return result.concat( getPagedItems(response.nextIndex) );
      } else {
        return result;
      }

  });
}

這給了我預期的結果:

"page received: 1"
"page received: 2"
"page received: 3"
"page received: 4"
"page received: 5"
"page received: 6"
"page received: 7"
"page received: 8"
"page received: 9"
"complete"

但是,如果我在getPagedItems的末尾添加一個do:

function getPagedItems(index) {
  return getPageFromServer(index)
    .flatMap(function (response) {
      var result = Rx.Observable.from(response.values);

      if(response.nextIndex !== undefined){
        return result.concat( getPagedItems(response.nextIndex) );
      } else {
        return result;
      }
  })
  .do( function ( result) { console.log( "do: " + result); } );
}

我得到每個值的次數等於我們在flatmap中創建的可觀察數量:

"starting..."
"do: 0"
"page received: 0"
"do: 1"
"page received: 1"
"do: 2"
"page received: 2"
"do: 3"
"do: 3"
"page received: 3"
"do: 4"
"do: 4"
"page received: 4"
"do: 5"
"do: 5"
"page received: 5"
"do: 6"
"do: 6"
"do: 6"
"page received: 6"
"do: 7"
"do: 7"
"do: 7"
"page received: 7"
"do: 8"
"do: 8"
"do: 8"
"page received: 8"
"do: 9"
"do: 9"
"do: 9"
"do: 9"
"page received: 9"
"complete"

請向我解釋為什么“do”多次觸發,但訂閱中的“onNext”只觸發一次。

非常感謝

在我發布問題后約5分鍾,我想出了這個答案!

do多次觸發的原因是因為我以遞歸方式調用loadCommentThreads,因此每個對loadComment線程的嵌套調用在消息返回到父調用函數實例之前都在管道中有do。

暫無
暫無

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

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