簡體   English   中英

將一系列有序操作合並為一個Observable

[英]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> 

暫無
暫無

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

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