2016-02-15 14 views
5

मैं सोच रहा हूँ अगर नमूदार या वादा कोणीय 2 में निम्नलिखित उपयोग के मामले में इस्तेमाल किया जा सकता है:कोणीय 2 वादा/देखने योग्य श्रृंखला दो घटनाओं?

दो asynchronized अपलोड कार्य कर रहे हैं। मैं जानना चाहता हूं कि मैं कैसे पता लगा सकता हूं कि दोनों कार्य समाप्त हो गए हैं।

मेरे अपलोड कार्य (वादा में लागू है, लेकिन यह आसानी से नमूदार अगर जरूरत के लिए बदला जा रहा है) इस तरह है:

myService.upload('upload1').then(() => { 
}) 

myService.upload('upload2').then(() => { 
}) 

कैसे श्रृंखला इन दोनों घटनाओं को एक साथ या तो वादा या में करने के लिए देखने योग्य ताकि मुझे पता चले कि दोनों कार्य समाप्त हो गए हैं? धन्यवाद

उत्तर

5

complete निष्पादित किया जाता है।

Rx.Observable.merge(
    myService.upload('upload1'), 
    myService.upload('upload2').subscribe({complete:() => { ... }); 

आप

Rx.Observable.merge(
    myService.upload('upload1'), 
    myService.upload('upload2') 
.take(2) 
.subscribe({complete:() => { ... }); 
+0

लेकिन एक त्रुटि संदेश मिला: *** मूल अपवाद : संदर्भ त्रुटि: चर नहीं मिल सकता: आरएक्स *** –

+0

ऐसा कुछ होना चाहिए: *** myService1.merge (myService2)। सदस्यता लें() ***। लेकिन यह वही नहीं है जो मैं चाहता हूं। मैं चाहता हूं कि आखिरी घटना प्राप्त करें। –

+0

क्या आपको अंतिम घटना की आवश्यकता है, या आप सिर्फ यह जानना चाहते हैं कि आखिरी घटना कब हुई है, यही 'पूर्ण' है (केवल तभी काम करता है जब स्रोत के बाद प्रेषक द्वारा स्रोत अवलोकन योग्य हो) –

7

आप अवलोकन के साथ Combining Operators में से एक का उपयोग कर सकते हैं। Observable.zip(), उदाहरण के लिए, वादे के साथ काम करता ... जब सभी स्रोत धारा बंद हो जाती हैं

Observable.zip(
    first, 
    second, 
    function (firstResolvedValue, secondResolvedValue) { 
     return firstResolvedValue && secondResolvedValue; 
    } 
) 

zip accepts a variable number of Observables or Promises as parameters, followed by a function that accepts one item emitted by each of those Observables or resolved by those Promises as input and produces a single item to be emitted by the resulting Observable.

7

के लिए प्रतीक्षा करने का प्रयोग करें forkJoin, जो कोणीय 1.x (ए और बी observables कर रहे हैं) से $ q.all के बराबर है परिणामों की एक अधिकतम संख्या सेट करना चाहते हैं :

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

आप Promise.all जो एक नया वादा जब तर्क सरणी में वादे के सभी समाधान कर लिया है निराकरण कि रिटर्न उपयोग कर सकते हैं।

Promise.all([myService.upload('upload1'), myService.upload('upload2')]).then(() => { 
    // ... 
}); 

ध्यान दें, अपने myService.upload विधि एक वादा, बजाय वादा लौटे हैं, तो आप वापसी मान इस तरह से पहुंच सकता है:

Promise.all([myService.upload('upload1'), myService.upload('upload2')]) 
    .then((retValue1, retValue2) => { 
    // ... 
}); 
संबंधित मुद्दे