2016-11-01 29 views
0

間違っていたと回復RされA非同期タスクを与えられました。回復が始まるときには、を回復するために残りの秒を残すためにが必要であり、希望する場合はTタイマーの早期終了のオプションを持つ必要があります。 Nの、再接続今再接続:Rx.Observable.retryWhen /タイマの早期終了

基本的に、私はと同様の機能を持つようにしたいですか?

// S - instance scope 

let ws = Rx.Observable.create((obs: Rx.Observer<{}>) => { 
    // A - async that may fail 
    obs.error("error"); 
}).retryWhen((errors: Rx.Observable<{}>) => { 
    // R - progress of recovery 
    return Rx.Observable.timer(5000); // T timer 
}); 

答えて

0

オカアイ、私はついにそれを理解しました。参考まで

run jsbin

console.clear(); 

let recoveryDelay = new Rx.Subject(Rx.Observer.create(), Rx.Observable.empty()); 
let recovery = new Rx.Subject(Rx.Observer.create(), Rx.Observable.empty()); 

let obs = Rx.Observable.create((obs) => { 
    setInterval(() => { 
    obs.next(Math.random()); 
    }, 1000); 

    setTimeout(() => { 
    obs.error('error'); 
    }, 3000); 
}).retryWhen((error) => { 
    return error.flatMap(() => { 

    recovery.onNext('wait...'); 

    return Rx.Observable.create((obs) => { 

     let sub = recoveryDelay.subscribe(() => { 
     recovery.onNext('force continue'); 
     obs.next(); 
     obs.onCompleted(); 
     }); 

     let timeout = setTimeout(() => { 
     obs.next(); 
     obs.onCompleted(); 
     }, 20000); 

     return() => { 
     recovery.onNext('ready'); 
     clearTimeout(timeout); 
     sub.dispose(); 
     } 
    }); 
    }); 
}); 

obs.subscribe(x => console.log(x)); 

recovery.subscribe(status => console.log('1 status ' + status)); 
recovery.subscribe(status => console.log('2 status ' + status)); 

setTimeout(() => { 
    recoveryDelay.onNext(); 
}, 5000); 
の転記