2016-02-06 20 views
13

के साथ वादा .all() मैं कोणीय 2 में एक ऐप लिख रहा हूं और मैं कई http अनुरोध निष्पादित करना चाहता हूं और प्रतिक्रियाओं पर एक फ़ंक्शन चलाता हूं।आरएक्सजेएस

कोणीय 1 में, मैं $q.all([$http.get(...), $http.get(...), ...]).then(doSomethingWithResponses);

लेकिन जैसे कुछ लिखते थे कोणीय 2 रिटर्न RxJS observables और पढ़ने का एक गुच्छा मैं अभी भी समझ नहीं कई HTTP अनुरोधों की प्रतिक्रियाएं प्राप्त करने के लिए के बाद। यह कैसे किया जा सकता है?

+4

forkJoin का प्रयोग करें, कि मैं एक जीवित forkJoin नमूना यहाँ http है Promise.all –

+4

के लिए बराबर है। कॉम/व्यूर्टिकल/कोणीय-2.0-और-http – TGH

+0

धन्यवाद @EricMartinez! – benshope

उत्तर

21

जैसा @Eric Martinez ने बताया, forkJoin है। फोर्कजोइन समानांतर में सभी अवलोकन अनुक्रम चलाता है और अपने अंतिम तत्व एकत्र करता है।

Rx.Observable.forkJoin([a,b]).subscribe(t=> { 
     var firstResult = t[0]; 
     var secondResult = t[1]; 
}); 
+2

@EricMartinez परिणामी सरणी में एक सूचकांक के लिए एक तरीका है "अघुलनशील" अगर अवलोकन करने योग्य या अवलोकन योग्य बी विफल हो (या रद्द हो या कोई त्रुटि हो या कोई शर्त न हो)? तो उदाहरण के लिए, यदि ऑब्जर्जेबल बी डेटा 1 के लिए विफल रहता है, तो परिणामस्वरूप सरणी की लंबाई 1 कॉल के लिए जिम्मेदार होगी जो Observable.forkJoin (...) तर्क ब्लॉक के अंदर बनाई गई थी? –

6

मुझे यकीन है कि आप forkJoin/zip का उपयोग करना चाहते हैं, विशेष रूप से विचार कर combineLatest समझने के लिए और प्रत्येक उप-धारा उत्सर्जित होने पर प्रत्येक उप-धारा घटना पर फेंकना होगा, जबकि forkJoin मूल रूप से नमूने आसान है नहीं कर रहा हूँ।

यह बाद में आपको काटने के लिए आ सकता है जब आप सड़क के नीचे बहु-वस्तु पर्यवेक्षकों को जोड़ना चाहते हैं।

+1

अंतर यह है कि आप हर स्ट्रीम पर हर उत्सर्जन के बारे में अधिसूचित नहीं होना चाहते हैं; आप केवल तभी देखभाल करते हैं जब सभी धाराओं ने डेटा उत्सर्जित किया हो। इसे 'Promise.all (वादे) 'या' $ q.all (वादे) 'के समतुल्य समकक्ष के रूप में सोचें। – GFoley83

1

मैं RxJS सीख रहा हूँ और मैं RxJS v5 के साथ एक ही बात करने के लिए

ऐसा लगता है जैसे हम v5 पर forkJoin अब और नहीं है कोशिश कर रहा था, इसलिए यहाँ है मैं कैसे मिला यह काम कर रहा (flatMap या साथ काम करता है mergeMap, जो कर रहे हैं उपनाम):

const callOne = value => 
    new window.Promise(resolve => 
     setTimeout(() => resolve(value + 10), 3000) 
    ); 

const callTwo = value => 
    new window.Promise(resolve => 
     setTimeout(() => resolve(value + 20), 1000) 
    ); 

Rx.Observable 
    .of(2) 
    .do(() => console.log('querying...')) 
    .mergeMap(number => 
     Rx.Observable.zip(
      Rx.Observable.fromPromise(callOne(number)), 
      Rx.Observable.fromPromise(callTwo(number)) 
     ) 
    ).concatAll() 
    .subscribe(createSubscriber('promises in parallel')); 
+0

मैं rxjs के चेंजलॉग को देख रहा हूं और मुझे फोर्क जोइन को बहिष्कृत करने के बारे में कुछ भी नहीं दिख रहा है https://github.com/ReactiveX/rxjs/blob/master/CHANGELOG.md – benshope

+0

@benshope क्या आप इसे चलाने के लिए प्राप्त करते हैं v5? फोर्कजॉइन का उपयोग करने का प्रयास करते समय मुझे एक त्रुटि मिलती है और मैं इसे src/operator के अंतर्गत नहीं देखता हूं। – rafaelbiten

+0

मैंने इसे चलाने का प्रयास नहीं किया, लेकिन ऐसा लगता है कि v5 अभी भी बीटा में है। शायद यह मुद्दा हो सकता है। इस उत्तर को सही के रूप में सेट करने में खुशी है अगर फोर्कजॉइन वास्तव में चला गया है – benshope

2

चाहेंगे नहीं एक merge काम करता है? आप onComplete कॉलबैक पर एक हैंडलर सब्सक्राइब और संलग्न कर सकते हैं।

मैं पहली बार मेरी observables की एक सरणी का निर्माण और उसके बाद स्थिर merge का उपयोग करें: //www.syntaxsuccess:

let obs_ary: any = [obs1, obs2, obs3]; 
Observable.merge(...obs_ary); 
संबंधित मुद्दे