2017-01-13 19 views
3

私はこのすばらしいものを学び始めました。一連の約束から値を取得する方法を理解することはできません。約束の配列から値を取得

const one = new Promise(resolve => { 
    setTimeout(() => { 
    resolve(1); 
    }, 1000); 
}) 
const two = new Promise(resolve => { 
    setTimeout(() => { 
    resolve(2); 
    }, 2000); 
}) 
const observable = Rx.Observable.from([one, two]); 
observable.subscribe(v => console.log(v)); 

私はコンソールに入る::

Promise { <pending> } 
Promise { <pending> } 

私が取得したいのですが:ここで午前どこだ

  1. 結果個人として値の配列[1,2]
  2. 結果約束の順番の値1,2

だから、基本的に私がエミュレートしたい:

  1. Promise.all([one, two])
  2. Promise.resolve(1), Promise.resolve(2)
+0

この記事は、あなたの質問にお答えしますhttp://stackoverflow.com/questions/30519645/how-can-i -make-one-rxjs-observable-sequence-wait-for-another-to-complete-before – aliegm

答えて

5

配列内の各アイテムを発するObservable.from() staticメソッドので、あなたが今持っているものだけで2つのPromiseオブジェクトを放出します。

「Higher-order Observable(Observables Observables Observables Observables)」とも呼ばれています。これは、RxJS 5では、指定された順序を気にするか、解決として収集できるかによって、concatAllまたはmergeAllで簡単に解決できます。

RxJS 5はObservables、Promises、iterators、array(および配列のようなオブジェクト)を同じ方法で扱います。これは、Observablesのようにあなたの約束を使用することを意味します。

ここではmergeAllを使用していますが、2番目のプロミスは、反対の順序[one, two]で定義されていますが、最初に完了したことを示しています。

const one = new Promise(resolve => { 
    setTimeout(() => { 
    resolve(1); 
    }, 1000); 
}) 
const two = new Promise(resolve => { 
    setTimeout(() => { 
    resolve(2); 
    }, 500); 
}) 

// Result as individual values in order of promise resolution 2,1 
Rx.Observable.from([one, two]) 
    .mergeAll() 
    .subscribe(v => console.log('mergeAll: ' + v)); 

// Result as an array of values [2,1] 
Rx.Observable.from([one, two]) 
    .concatAll() 
    .toArray() 
    .subscribe(v => console.log(v)); 

はライブデモを参照してください:https://jsbin.com/tigidon/4/edit?js,console

はこれがコンソールに出力します。

mergeAll: 2 
mergeAll: 1 
[2, 1] 
+0

あなたは素晴らしいです!わたしは、あなたを愛しています!どうもありがとうございました! –