RxJS वेधशालाओं के साथ Promise.all व्यवहार?


91

कोणीय 1.x में मुझे कभी-कभी कई httpअनुरोध करने और सभी प्रतिक्रियाओं के साथ कुछ करने की आवश्यकता होगी । मैं सभी वादों को एक सरणी में फेंक दूंगा और कॉल करूंगा Promise.all(promises).then(function (results) {...})

अनुरोधों Observableमें वादों को बदलने के लिए RxJS के उपयोग की ओर कोणीय 2 सर्वोत्तम अभ्यास इंगित करते हैं http। अगर मेरे पास http अनुरोधों से निर्मित दो या अधिक भिन्न वेधशालाएँ हैं, तो क्या इसके बराबर है Promise.all()?

जवाबों:


80

अनुकरण Promise.allकरने के लिए अधिक सरल विकल्प forkJoinऑपरेटर का उपयोग करना है (यह समानांतर में सभी वेधशाला शुरू करता है और अपने अंतिम तत्वों में शामिल होता है):

थोड़ा सा दायरे से बाहर है, लेकिन अगर यह वादों का पीछा करने में मदद करता है, तो आप एक सरल का उपयोग कर सकते हैं flatMap: सीएफ। RxJS वादा संरचना (डेटा पास करना)


1
अगर मेरे पास 2 कॉल एक वापसी का वादा है और एक और वापसी योग्य है तो क्या मैं उपयोगकर्ता को forkjoin कर सकता हूं? या वादा। या कोई नहीं, मुझे 2 कार्यों को एक ही प्रकार के वादे या अवलोकन योग्य वापस करने देना है?
जो स्लीमैन

1
कृपया मदद करें, जब पर्यवेक्षक मानों का उत्सर्जन नहीं करते हैं, तो forJJoin काम नहीं करता है। मेरे पास वेधशालाएँ हैं और अभी भी forkJoin कार्यक्षमता का उपयोग करना चाहते हैं लेकिन यह काम नहीं कर रहा है
गोगा कोरेली

19

RxJs v6 का उपयोग करके मई 2019 को अपडेट करें

अन्य उत्तर उपयोगी पाए गए, और zipउपयोग के बारे में अरनौद द्वारा दिए गए उत्तर के लिए एक उदाहरण प्रस्तुत करना चाहते थे ।

यहाँ एक स्निपेट है जो Promise.allआरएक्सजे के बीच और समतुल्यता को दर्शाता है zip(नोट भी, rxjs6 में कि ज़िप अब "rxjs" का उपयोग करके कैसे आयात किया जाता है और ऑपरेटर के रूप में नहीं)।

import { zip } from "rxjs";

const the_weather = new Promise(resolve => {
  setTimeout(() => {
    resolve({ temp: 29, conditions: "Sunny with Clouds" });
  }, 2000);
});

const the_tweets = new Promise(resolve => {
  setTimeout(() => {
    resolve(["I like cake", "BBQ is good too!"]);
  }, 500);
});

// Using RxJs
let source$ = zip(the_weather, the_tweets);
source$.subscribe(([weatherInfo, tweetInfo]) =>
  console.log(weatherInfo, tweetInfo)
);

// Using ES6 Promises
Promise.all([the_weather, the_tweets]).then(responses => {
  const [weatherInfo, tweetInfo] = responses;
  console.log(weatherInfo, tweetInfo);
});

दोनों से आउटपुट समान हैं। ऊपर चल रहा है देता है:

{ temp: 29, conditions: 'Sunny with Clouds' } [ 'I like cake', 'BBQ is good too!' ]
{ temp: 29, conditions: 'Sunny with Clouds' } [ 'I like cake', 'BBQ is good too!' ]

मेरे लिए काम किया :)
नवीन कुमार V

12

forkJoin भी ठीक काम करता है, लेकिन मैं CombLLest को पसंद करूँगा क्योंकि आपको इसके बारे में चिंता करने की ज़रूरत नहीं है कि वे वेधशालाओं का अंतिम मूल्य ले रहे हैं। इस तरह, आप बस तब भी अपडेट हो सकते हैं जब उनमें से कोई भी एक नया मान भी उत्सर्जित करता है (जैसे कि आप एक अंतराल या कुछ और प्राप्त करते हैं)।


1
यह मेरी वर्तमान जरूरतों को पूरा नहीं करता है लेकिन मैं निश्चित रूप से जल्द ही इसका उपयोग करूंगा।
कोरी ओगबर्न

5
यह
Promise.all

अगर मेरे पास 2 कॉल एक वापसी का वादा है और एक और वापसी योग्य है तो क्या मैं उपयोगकर्ता को forkjoin कर सकता हूं? या वादा। या कोई नहीं, मुझे 2 कार्यों को एक ही प्रकार के वादे या अवलोकन योग्य वापस करने देना है?
जो स्लीमैन

1
@JoeSleiman थोड़ा देर से, लेकिन आप अपना पक्ष चुन सकते हैं: Observable.fromPromise () एक साथ Observable.zip () , या Obserable.toPromise () के साथ Promise.all ()
Arnaud P

11

पर reactivex.io forkJoin वास्तव में करने के लिए अंक पिन , जो मेरे लिए काम किया है:

let subscription = Observable.zip(obs1, obs2, ...).subscribe(...);

"इसका मतलब है कि forkJoin एक से अधिक बार उत्सर्जन नहीं करेगा और यह उसके बाद पूरा होगा। यदि आपको पास किए गए वेधशालाओं के जीवनचक्र के अंत में न केवल संयुक्त मूल्यों का उत्सर्जन करने की आवश्यकता है, बल्कि इसके अलावा, इसके बजाय CombLatest या Zip को आज़माएं।" rxjs-dev.firebaseapp.com/api/index/function/forkJoin
जेफरी निकोल्सन कर्रे

3
forkJoin सभी वेधशालाओं के समाप्त होने की प्रतीक्षा करता है, जबकि ज़िप एक सरणी का उत्सर्जन करता है जब सभी इनपुट अपने पहले मूल्य का उत्सर्जन करते हैं। ज़िप कई बार निकल सकती है। यदि आपके पास http- कॉल है, तो इससे कोई फर्क नहीं पड़ता।
14 फरवरी को hgoebl

ठीक है, मुझे अब सूक्ष्मता मिलती है, चीयर्स। मुझे एहसास नहीं था कि भाषा अनुभागों का विस्तार होता है-_-
अरनौद पी 20
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.