rxjs 中 do 和 subscribe 的区别
Difference between do and subscribe in rxjs
在这个 JS Bin 中,我有一些加载模拟分页数据源的可观察对象。 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 合并为一个,这样我们就可以获得所有页面的所有值的 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); } );
}
我得到每个值的次数等于我们在平面图中创建的可观察对象的数量:
"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 线程的嵌套调用在消息 returns 到父调用函数实例之前的管道中都有一个 do。
在这个 JS Bin 中,我有一些加载模拟分页数据源的可观察对象。 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 合并为一个,这样我们就可以获得所有页面的所有值的 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); } );
}
我得到每个值的次数等于我们在平面图中创建的可观察对象的数量:
"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 线程的嵌套调用在消息 returns 到父调用函数实例之前的管道中都有一个 do。