2017-04-11 10 views
8

मैं वादा दुनिया से पर्यवेक्षण दुनिया में जा रहा हूं। एक बात जो मैं आम तौर पर वादा करता हूं वह है कि कार्यों की एक श्रृंखला को श्रृंखलाबद्ध करें और उन्हें अनुक्रम में चलाएं। उदाहरण के लिए, मैं तीन कार्यों है: printLog1(), कंसोल के लिए 1 मुद्रित करने के लिए printLog23() कंसोल के लिए 2 और 3 मुद्रित करने के लिए, और printLog4() मुद्रित करने के लिए 4.अनुक्रम में निष्पादित करने के लिए अवलोकन को कैसे बल दें?

जब मैं 1-2-3-4 प्रिंट करना चाहते हैं, मैं जैसे

printLog1() 
    .then(() => { 
    printLog23(); 
    }) 
    .then(() => { 
    printLog4(); 
    }); 

अब मैं प्रत्यक्ष साथ ही कार्यक्षमता चाहते हैं एक वादा श्रृंखला लिखते थे और मैं की तरह

printLog1 = Rx.Observabale.of(1).map((i) => console.log(i)); 
printLog23 = Rx.Observabale.of(2, 3).map((i) => console.log(i)); 
printLog4 = Rx.Observabale.of(4).map((i) => console.log(i)); 

तो मैं तीन observables है एक नमूदार में printLog() समारोह पुनर्लेखन कर सकते हैं कि विभिन्न va का उत्सर्जन करता है कंसोल के लिए lues। मैं उन्हें कैसे श्रृंखलाबद्ध करूं ताकि ये तीन अवलोकन क्रमशः चल सकें और 1-2-3-4 प्रिंट करें?

उत्तर

11

यदि आप यह सुनिश्चित करना चाहते हैं कि उत्सर्जन का क्रम उसी स्रोत जैसा है जिसे आपने स्रोत ऑब्जर्वेबल निर्दिष्ट किया है तो आप concat या concatMap ऑपरेटरों का उपयोग कर सकते हैं।

concat* ऑपरेटर पिछले अवलोकन करने के बाद केवल एक पर्यवेक्षक की सदस्यता लेते हैं (यह वादे के साथ भी काम करता है, http://reactivex.io/rxjs/class/es6/MiscJSDoc.js~ObservableInputDoc.html देखें)।

आप के मामले में यह की तरह लग रही होगी निम्नलिखित:

Observable.concat(printLog1, printLog23, printLog4); 

... या concatMap साथ अगर एक वादा के लिए अनुरोध पिछले वादा से प्रतिक्रिया पर निर्भर करता है:

printLog1 
    .concatMap(response => ...) 
    .concatMap(response => ...); 

... या जब ऑर्डर कोई फर्क नहीं पड़ता है तो आप merge का उपयोग कर सकते हैं जो सभी ऑब्जर्वेबल/वादे को तत्काल सदस्यता लेता है और उनके परिणाम तब तक पहुंचता है जब वे पहुंचते हैं:

Observable.merge(printLog1, printLog23, printLog4); 
+0

मुझे कंसल्ट ऑपरेटरों की याद दिलाने के लिए धन्यवाद। –

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