2017-01-19 18 views
11

मैं ऐसे जैसे एक सरणी में observables धक्का हूँ ...RXJS एक सरणी में सभी observables के लिए प्रतीक्षा करें पूरा करने के लिए (या त्रुटि)

var tasks$ = []; 
tasks$.push(Observable.timer(1000)); 
tasks$.push(Observable.timer(3000)); 
tasks$.push(Observable.timer(10000)); 

मैं एक नमूदार चाहते का उत्सर्जन करता है कि जब सभी कार्य पूरा कर लिया है $। ध्यान रखें, व्यावहारिक रूप से, कार्यों में $ अवलोकन योग्य संख्या नहीं है।

मैंने Observable.zip(tasks$).subscribe() को आजमाया है, लेकिन ऐसा लगता है कि केवल 1 कार्य है, और यह मुझे विश्वास करने के लिए प्रेरित कर रहा है कि ज़िप को उम्मीद है कि जिस तरह से मैं अपेक्षा करता हूं, उसमें काम करने के लिए ज़िप की भी आवश्यकता है।

मैंने Observable.concat(tasks$).subscribe() की कोशिश की है लेकिन कॉन्सट ऑपरेटर का नतीजा सिर्फ अवलोकनों की एक सरणी है ... उदा। मूल रूप से इनपुट के समान ही। आप इस पर सब्सक्राइब भी नहीं कर सकते हैं।

सी # में यह कार्य के समान होगा। जब सभी()। ईएस 6 में वादा करता है कि यह Promise.all() के समान होगा।

मैं कई सारे प्रश्नों में आया हूं लेकिन वे सभी ज्ञात संख्याओं (जैसे उन्हें एक साथ मैपिंग) पर प्रतीक्षा करने का सामना करते हैं।

+1

यह इस बात पर निर्भर करता है कि आप क्या करना चाहते हैं जब किसी भी पर्यवेक्षक त्रुटि अधिसूचना भेजते हैं। क्या आप केवल त्रुटि को अनदेखा करना चाहते हैं या इसका मतलब यह है कि पूरा परिणाम त्याग दिया जाएगा और आपको केवल त्रुटि प्राप्त होगी। – martin

उत्तर

26

आप का उत्सर्जन करता है कि जब स्रोत के सभी पूरा observables एक नमूदार रचना करना चाहते हैं, तो आप forkJoin उपयोग कर सकते हैं:

import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/observable/forkJoin'; 
import 'rxjs/add/operator/first'; 

var tasks$ = []; 
tasks$.push(Observable.timer(1000).first()); 
tasks$.push(Observable.timer(3000).first()); 
tasks$.push(Observable.timer(10000).first()); 
Observable.forkJoin(...tasks$).subscribe(results => { console.log(results); }); 
+6

सावधान रहें यदि 'कार्य' गतिशील रूप से बनाया गया है और खाली है, तो फोर्क जोइन अवलोकन योग्य अनुक्रम को रोक देगा। अधिक जानकारी के लिए यहां मेरा उत्तर देखें http://stackoverflow.com/a/42622968/1224564 – bgondy

+0

तीसरे अवलोकन करने योग्य ओ पूंजी में घोषित नहीं किया गया था, इसलिए इसके परिणामस्वरूप अवलोकन योग्य अपरिभाषित है। साथ ही, सब्सक्राइब करने से पहले कार्य समाप्त होने वाले डॉलर के चिह्न में कमी आई है। मैं जवाब संपादित नहीं कर सकता क्योंकि: संपादन कम से कम 6 वर्ण होना चाहिए; क्या इस पोस्ट में सुधार करने के लिए कुछ और है? –

+0

मैं हमेशा के लिए आपको नाराज नहीं करना चाहता, लेकिन मुझे लगता है कि परिणाम प्रदर्शित नहीं होंगे क्योंकि अवलोकन योग्य प्रवाह पूरा नहीं हुआ है। टाइमर कॉल या .take (n) के बाद और अधिक दिलचस्प परिणाम प्राप्त करने के बाद बस। पहले() जोड़ सकते हैं। फोर्कजोइन ऑपरेटर था जिसे मैं चाहता था, धन्यवाद @ कार्टेंट! –

0

मुझे इस sample के लिए सबसे अच्छा समाधान था।

const source = Observable.interval(500); 
const example = source.sample(Observable.interval(2000)); 
const subscribe = example.subscribe(val => console.log('sample', val)); 

तो .. केवल जब दूसरा (उदाहरण) का उत्सर्जन - आप पहली बार (स्रोत) के अंतिम उत्सर्जित मूल्य देखेंगे।

मेरे कार्य में, मैं फॉर्म सत्यापन और अन्य डोम ईवेंट का इंतजार करता हूं।

संबंधित मुद्दे