আমি কীভাবে কোনও আরএক্স পর্যবেক্ষণযোগ্যের জন্য অপেক্ষা করতে পারি?


106

আমি একটি পর্যবেক্ষণযোগ্য হিসাবে অপেক্ষা করতে সক্ষম হতে চাই

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

একটি নিষ্কলুষ প্রচেষ্টার ফলাফল অবিলম্বে সমাধানের অপেক্ষায় এবং কার্যকর করা অবরুদ্ধ করে না

সম্পাদনা: আমার সম্পূর্ণ উদ্দেশ্যে ব্যবহারের ক্ষেত্রে সিউডোকোডটি হ'ল:

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

আমি বুঝতে পারি যে আমি অন্যান্য কোডটি অন্য একটি পৃথক ফাংশনে স্থানান্তরিত করতে এবং এটি সাবস্ক্রাইব কলব্যাকে পাস করতে পারি, তবে আমি এটি এড়াতে সক্ষম হতে পারব বলে আশা করছি।


আপনি কি বাকী কোডটি (যা আপনি উত্সের জন্য অপেক্ষা করতে চান) কোনও .subscribe()পদ্ধতিতে কল করতে পারবেন না?
স্ট্রিপলিং ওয়ারিয়র

উত্তর:


131

আপনি একটি প্রতিশ্রুতি পাস করতে হবে await। পর্যবেক্ষকের পরবর্তী ইভেন্টকে একটি প্রতিশ্রুতিতে রূপান্তর করুন এবং এটির জন্য অপেক্ষা করুন।

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

সম্পাদনা দ্রষ্টব্য: এই উত্তরটি প্রাথমিকভাবে ব্যবহৃত হয়েছিল .টেক (1) তবে ব্যবহার করতে পরিবর্তন করা হয়েছিল। প্রথম () যা প্রতিশ্রুতির বিষয়টি কখনই সমাধান না করে এড়ানো এড়ায় যদি কোনও মানটি আসার আগে এই স্ট্রিমটি শেষ হয়।


3
এর পরিবর্তে (1) আপনি ব্যবহার করতে পারেন await observable.first().toPromise();?
এপ্রিসিটি

14
@ জনপ্রিয়তা যদি সমাপ্তির কোনও মান first()না থাকে তবে তা প্রত্যাখ্যান take(1)করবে এবং প্রতিশ্রুতি মুলতুবি হতে থাকবে।
এস্তাস ফ্লাস্ক

6
@ অ্যাপ্রিসিটি @ এজেন্টএম আসলে আপনার উচিত হয় take(1)না first()এবং এর মতো ক্ষেত্রেও ব্যবহার করা উচিত নয় । যেহেতু আপনি ঠিক এক ইভেন্টের প্রত্যাশা করছেন তাই আপনার ব্যবহার করা উচিত single()যা 1 টিরও বেশি উপস্থিত থাকলে একটি ব্যতিক্রম ছুঁড়ে ফেলবে, যখন কোনও কিছুই নেই তখন ব্যতিক্রম ছোঁড়াবেন না। যদি আপনার কোড / ডেটা মডেল ইত্যাদির মধ্যে একাধিক সমস্যা থাকে তবে আপনি যদি অবিচ্ছিন্নভাবে ব্যবহার না করেন তবে আপনি প্রথমে যে আইটেমটি বেছে নেবেন তা সতর্কতা ছাড়াই ফিরে আসবে। সর্বদা একই ক্রম বজায় রাখার জন্য আপনাকে আপস্ট্রিম ডেটা উত্সের আপনার প্রিডিকেটে যত্ন নিতে হবে।
ntziolis

3
আমদানিটি ভুলে যাবেন না:import 'rxjs/add/operator/first';
স্টেফানি

7
এখন যে টোপ্রিমাইজ () অবমূল্যায়িত হয়েছে, আমাদের এটি কীভাবে করা উচিত?
Jus10

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অবজ্ঞা করা হয়েছে তা সরান ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.