2016-08-10 29 views
6

में सिंक्रोनस http कॉल कैसे करें इस प्रश्न को पहले ही here से पूछा जा चुका है। हालांकि, चूंकि प्रश्नकर्ता के आवेदन संदर्भ में सवाल में बहुत अधिक शामिल है, इसलिए मैं मूल बातें समझ नहीं पाया। उदाहरण के लिए, queryArr पैरामीटर है। यह क्या करता है?कोणीय 2

वैसे भी, मुझे सिंक्रोनस http कॉल को सरल तरीके से बनाने के तरीके के बारे में थोड़ा सा मार्गदर्शन चाहिए। जिस समाधान के साथ मैं आया था वह है कि किसी को "नेस्टेड" ऑर्डर में अवलोकनों की सदस्यता लेनी होगी। उदाहरण के लिए, अवलोकन ox और oy हैं। अनुरोध के डाटा oy में बुलाया जा रहा है डेटा पर निर्भर है ox से आता है:

xData: string = ""; 
yData: string = ""; 

ox.subscribe(
    data => {xData = data;}, 
    error => console.log(error), 
    () => { 
     oy.subscribe(
      data => {yData = xData*data;}, 
      error => console.log(error), 
      () => console.log("aaa") 
     ); 
    } 
); 

पिछली बार मुझे याद है (मैं जावास्क्रिप्ट ज्यादा नहीं करते हैं, और एक छोटे से नौसिखिया हूँ), गुंजाइश मैं कहाँ सदस्यता ली में oy पर, xData या yData अब और नहीं देखा जा सकता है। कृपया मुझे सही करें और मुझे गलत दिशा में इंगित करें यदि मैं गलत हूं।

क्या इस तरह की चीज करने के लिए कोई "अच्छा" समाधान या बेहतर तरीका है?

उत्तर

5

मुझे लगता है कि आप एक HTTP अनुरोध निष्पादित करने के लिए flatMap ऑपरेटर पर एक नज़र डाल सकते हैं, इसकी प्रतिक्रिया के लिए प्रतीक्षा करें और दूसरा निष्पादित करें।

यहाँ एक नमूना है:

executeHttp(url) { 
    return this.http.get(url).map(res => res.json()); 
} 

executeRequests() { 
    this.executeHttp('http://...').flatMap(result => { 
    // result is the result of the first request 
    return this.executeHttp('http://...'); 
    }).subscribe(result => { 
    // result is the result of the second request 
    }); 
} 

आप subscribe विधि में दोनों परिणामों के लिए उपयोग करना चाहते हैं, तो आप का लाभ उठाने सकता है Observable.forkJoin और Observable.of:

executeRequests() { 
    this.executeHttp('http://...').flatMap(result => { 
    // result is the result of the first request 
    return Observable.forkJoin([ 
     Observable.of(result), 
     this.executeHttp('http://...'); 
    }).subscribe(results => { 
    // result is the result of both requests 
    let result1 = results[0]; 
    let result2 = results[1]; 
    }); 
} 
+5

यह कई श्रृंखलित बनाने प्रतीत होता है http अनुरोध, लेकिन सवाल सरल था कि एक सिंक्रोनस http अनुरोध कैसे करें, जिसे मैं नहीं देखता कि यह कैसे जवाब देता है। – Neutrino

+0

एक http अनुरोध कभी भी तुल्यकालिक नहीं होगा, आपको उचित सॉफ़्टवेयर डिज़ाइन (पर्यवेक्षण आधारित) होना चाहिए और उल्लिखित [Observable.forkJoin] पर एक नज़र रखना चाहिए (https://www.learnrxjs.io/operators/combination/forkjoin एचटीएमएल) ऑपरेटर http कॉल को समानांतर करने के लिए और सभी समाप्त हो जाने के बाद सदस्यता प्राप्त करें। – Markus