मैं एक आरएक्स ऑब्जर्वेबल पर `वेट` कैसे कर सकता हूं?


106

मैं एक अवलोकन योग्य उदाहरण पर प्रतीक्षा करने में सक्षम होना चाहता हूँ, जैसे

const source = Rx.Observable.create(/* ... */)
//...
await source;

एक भोले प्रयास के तुरंत परिणाम का इंतजार करते हैं और निष्पादन को अवरुद्ध नहीं करते हैं

संपादित करें: मेरे पूर्ण इच्छित उपयोग के मामले के लिए छद्म कोड है:

if (condition) {
  await observable;
}
// a bunch of other code

मैं समझता हूं कि मैं दूसरे कोड को एक और अलग फ़ंक्शन में स्थानांतरित कर सकता हूं और इसे सदस्यता कॉलबैक में पास कर सकता हूं, लेकिन मैं उम्मीद कर रहा हूं कि इससे बचने में सक्षम हो।


क्या आप शेष कोड (जिसे आप स्रोत के लिए प्रतीक्षा करना चाहते हैं) को एक .subscribe()विधि कॉल में स्थानांतरित नहीं कर सकते हैं ?
स्ट्रिपिंगवर्यर

जवाबों:


132

आपको एक वादा पास करना होगा await। अवलोकन की अगली घटना को एक वादा में परिवर्तित करें और प्रतीक्षा करें।

if (condition) {
  await observable.first().toPromise();
}

नोट संपादित करें: यह उत्तर मूल रूप से उपयोग किया जाता है। (1) लेकिन इसका उपयोग करने के लिए बदल दिया गया था। प्यास () जो वादा के मुद्दे से बचता है अगर मूल्य के माध्यम से धारा समाप्त होने से पहले कभी हल नहीं होता है।


3
लेने के बजाय (1) आप उपयोग कर सकते हैं await observable.first().toPromise();?
apricity

14
@apricity यदि पूरा होने पर कोई मूल्य नहीं थे, first()तो अस्वीकृति take(1)का परिणाम होगा , और परिणामस्वरूप लंबित वादा होगा।
एस्टस फ्लास्क

6
@apricity @AgentME वास्तव में आप का उपयोग नहीं करना चाहिए या तो take(1)है और न ही first()इस तरह के मामलों में। चूंकि आप वास्तव में एक घटना होने की उम्मीद कर रहे हैं, इसलिए आपको इसका उपयोग करना चाहिए single()जो 1 से अधिक होने पर एक अपवाद फेंक देगा, जबकि एक अपवाद नहीं है जब कोई नहीं है। यदि एक से अधिक है तो आपके कोड / डेटा मॉडल आदि में कुछ गड़बड़ होने की संभावना है। यदि आप एकल का उपयोग नहीं करते हैं तो आप मनमाने ढंग से पहले आइटम को चुन लेंगे जो बिना किसी चेतावनी के वापस आ जाएगी। आपको हमेशा उसी क्रम को बनाए रखने के लिए अपस्ट्रीम डेटा स्रोत पर अपने विधेय का ध्यान रखना होगा।
ntziolis

3
आयात मत भूलना:import 'rxjs/add/operator/first';
स्टेफ़नी

7
अब जब कि ToPromise () पदावनत हो गया है, तो हमें यह कैसे करना चाहिए?
जुस 10

26

यह होने की संभावना है

await observable.first().toPromise();

जैसा कि पहले टिप्पणियों में उल्लेख किया गया था, जब खाली अवलोकन पूरा हो जाता है तो ऑपरेटरों take(1)और first()ऑपरेटरों के बीच पर्याप्त अंतर होता है।

Observable.empty().first().toPromise()परिणाम के साथ अस्वीकृति के EmptyErrorअनुसार तदनुसार संभाला जा सकता है, क्योंकि वास्तव में कोई मूल्य नहीं था।

और मूल्य के Observable.empty().take(1).toPromise()साथ संकल्प में परिणाम होगा undefined


वास्तव में एक लंबित वादा नहींtake(1) करेगा । यह एक वादा के साथ हल निकलेगा । undefined
जोहान टी हार्ट

ध्यान देने के लिए धन्यवाद, यह सही है। मुझे यकीन नहीं है कि पद अलग क्यों हुआ, संभवतः व्यवहार किसी बिंदु पर बदल गया।
एस्टस फ्लास्क

8

आपको awaitएक वादा करने की आवश्यकता होगी , इसलिए आप उपयोग करना चाहेंगे toPromise()। अधिक जानकारी के लिए इसे देखें toPromise()


4

यदि toPromiseआप के लिए हटा दिया है, तो आप उपयोग कर सकते हैं .pipe(take(1)).toPromise, लेकिन आप देख सकते हैं यहाँ यह पदावनत नहीं है।

तो कृपया का उपयोग करें toPromise(RxJs 6) के रूप में कहा:

//return basic observable
const sample = val => Rx.Observable.of(val).delay(5000);
//convert basic observable to promise
const example = sample('First Example')
  .toPromise()
  //output: 'First Example'
  .then(result => {
    console.log('From Promise:', result);
  });

async / प्रतीक्षा उदाहरण:

//return basic observable
const sample = val => Rx.Observable.of(val).delay(5000);
//convert basic observable to promise
const example = await sample('First Example').toPromise()
// output: 'First Example'
console.log('From Promise:', result);

और अधिक पढ़ें यहाँ

और कृपया इस गलत दावे को हटा दें और कहा गया toPromiseहै कि यह पदावनत है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.