将有序操作列表合并为一个可观察量
Combine a list of ordered operations into one Observable
var state = [];
var operation1 = function() {
return Rx.Observable.fromPromise(new Promise((resolve, reject) => {
state.push(1, 2);
setTimeout(resolve, 300, state);
}));
};
var operation2 = function() {
return Rx.Observable.fromPromise(new Promise((resolve, reject) => {
state = state.map(x => x * 2);
setTimeout(resolve, 200, state);
}));
};
var operation3 = function() {
return Rx.Observable.fromPromise(new Promise((resolve, reject) => {
state = state.reduce( (prev, next) => prev + next );
setTimeout(resolve, 100, state);
}));
};
var operations = [operation1, operation2, operation3];
鉴于上面的代码,我正在尝试将operations
组合成一个发出每个操作状态的Observable
。因此,Observable
需要执行以下任一操作:
- 发射 3 次:
[1, 2], [2, 4], 6
- 发出 1 次:
[[1, 2], [2, 4], 6]
你可以试试 (jsbin(
var state = [];
var operation1 = Rx.Observable.defer(function() {
return Rx.Observable.fromPromise(new Promise((resolve, reject) => {
state.push(1, 2);
setTimeout(resolve, 300, state);
}));
});
var operation2 = Rx.Observable.defer(function() {
return Rx.Observable.fromPromise(new Promise((resolve, reject) => {
state = state.map(x => x * 2);
setTimeout(resolve, 200, state);
}));
});
var operation3 = Rx.Observable.defer(function() {
return Rx.Observable.fromPromise(new Promise((resolve, reject) => {
state = state.reduce( (prev, next) => prev + next );
setTimeout(resolve, 100, state);
}));
});
var operations = Rx.Observable.from([operation1, operation2, operation3]).merge(1);
operations.subscribe(function(x){console.log(x)})
请检查这是否可行,稍后我将详细说明其工作原理。
您可以使用
Rx.Observable.concat
但我认为如果没有rx.java并使用Promise.all,这个简单的情况会更容易。
let slow = new Promise((resolve) => {
setTimeout(resolve, 200, 'slow');
});
let instant = new Promise((resolve) => {
setTimeout(resolve, 0, 'instant');
});
let quick = new Promise((resolve) => {
setTimeout(resolve, 50, 'quick');
});
var operation1 = function() {
return Rx.Observable.fromPromise(slow);
}
var operation2 = function() {
return Rx.Observable.fromPromise(instant);
}
var operation3 = function() {
return Rx.Observable.fromPromise(quick);
}
var operations = [operation1(), operation2(), operation3()];
var source = Rx.Observable.concat(operations);
var subscription = source.subscribe(
function(x) {
console.log('Next: ' + x);
},
function(err) {
console.log('Error: ' + err);
},
function(a) {
console.log('Completed', a);
});
// Or with promises
operations = [slow, instant, quick]
Promise.all(operations)
.then(console.log.bind(console, "Promise all"))
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.all.min.js"></script>
相关文章:
- Knockout observable没有观察到其中一个属性
- 在另一个可观察量完成后触发第二个表单提交单击
- $scope$观察数组中的一个特定对象——Angular JS控制器
- Angularjs - 观察模态窗口从另一个控制器关闭
- 使用rxjs创建一个可观察的对象,该对象稍后将连接到web套接字
- Knockout.js用单个json对象绑定一个可观察对象
- RxJS:我怎样才能用可观察量做一个“如果”
- Javascript 错误: $(..).观察不是一个函数
- 一个控制器如何在 Ember .js 中观察任意控制器/模型上的事件
- Ember.js:一个模型如何观察其他模型
- KNOCKOUTJS 将多个输入元素绑定到一个可观察量
- 从另一个可观察对象获取价值的最佳方法,而无需组合最新
- 更改一个对象的可观察属性会更改集合中所有对象的属性
- 创建一个依赖于可观察量“树”的 Knockout 绑定处理程序
- 挖空JS只使复杂对象数组的一个属性可观察
- 可观察到的敲除不是一个函数
- DOM突变观察者:如何支持DOM3突变事件的一个重要用途
- 如何拥有一个可观察的集合,该集合可以从两个源进行更新,而不会在knockout.js中引起循环
- 如何在下拉列表中设置一个可观察的值
- 在一个观察者- Magento的PHP页面中运行JavaScript