2016-05-15 10 views
28

निष्पादित हो जाता है मैं एक अजीब मुद्दा जहां Angular2 के (RC1) Http सेवा दो बार http.post कॉल निष्पादित करता है भर में आया था। मैंने अपना ऐप डीबग किया है और मुझे पता है कि यह एक क्लिक इवेंट मुद्दा नहीं है। कोर कॉल कॉलAngular2 http.post दो बार

public create(json: Object, params?: Object): Observable<T> { 
    let body = JSON.stringify([json]); 
    let headers = this.getHeaders(); 
    let options = new RequestOptions({ headers: headers }); 

    return this._http.post(this.createURL(this.getCreateURL(), [], params), body, options) 
    .map(res => this.handleObjectResponse(res)); 
} 

एक बार चलाए जाने वाले सभी कॉल। तब जब मैंने इस मुद्दे का पता लगाना शुरू किया तो मुझे पता चला कि मेरा हैंडलर this.handleObjectResponse दो बार निष्पादित हो जाता है। तो मैं आगे delved और @angular/http/src/backends/xhr_backend.ts पर पहुंच गया है, जहां वे इस

constructor(req: Request, browserXHR: BrowserXhr, baseResponseOptions?: ResponseOptions) { 
    this.request = req; 
    this.response = new Observable<Response>((responseObserver: Observer<Response>) => { 
     let _xhr: XMLHttpRequest = browserXHR.build(); 
     _xhr.open(RequestMethod[req.method].toUpperCase(), req.url); 
     // load event handler 
     ... 
     .. 

तो मैं एक ब्रेकपाइंट this.request = req; पर एक और ब्रेकप्वाइंट let _xhr: XMLHttpRequest = browserXHR.build(); पर डाल दिया और उसके बाद क्या करना है और मुझे पता चला मैं पहली बार ब्रेकप्वाइंट एक बार हिट लेकिन फिर मैं से दूसरे ब्रेकप्वाइंट मारा दो बार कॉलबैक

यह मैं पागल गाड़ी चला कर दिया गया है तो मैं जांच करने के लिए किसी को भी angular2 internals से परिचित कुछ प्रकाश यह एक बग या कुछ है कि मैं गलत किया है की तरह लग रहा है कि क्या शेड सकता है कि क्या करना चाहता था। GenericService और FullService जो GenericService लागू होता है:

मेरी कोड में मैं कुछ सार सामान्य सेवा कक्षाएं बना लिया है। इन दोनों सार और उपयोग जेनरिक कर रहे हैं और वास्तविक सेवा कक्षाएं कि विभिन्न घटकों में इंजेक्शन मिल सब या तो GenericService या FullService का विस्तार। क्या आप लोग सोचते हैं कि यह सेटअप संभवतः डबल पोस्ट निष्पादन के लिए ज़िम्मेदार हो सकता है?

सभी विचारों की सराहना कर रहे हैं!

अग्रिम धन्यवाद!

पीएस

इस के साथ ऐसा नहीं होता हो जाता है लेकिन यह भी कहते हैं के साथ होता है।

+0

क्या आप कॉलिंग कोड साझा कर सकते हैं? हो सकता है कि अवलोकन योग्य पर एक से अधिक सब्सक्राइब करें, इस मामले में 'इसे वापस करें ._http.post (this.createURL (this.getCreateURL(), [], पैराम्स), बॉडी, विकल्प) .map (res => this.handleObjectResponse (res))। शेयर(); ' इसे हल करना चाहिए https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/share.md – teleaziz

+1

पवित्र बकवास! बहुत बहुत धन्यवाद - जिसने वास्तव में इसे हल किया था। अब मुझे अपने सिर को लपेटने की ज़रूरत है जो मैंने इसे पहले स्थान पर करने के लिए किया है। इसे उत्तर के रूप में पोस्ट करने के लिए स्वतंत्र महसूस करें ताकि मैं इसे स्वीकार कर सकूं और फिर एक टन धन्यवाद !!!! – RVP

उत्तर

53

http सेवा एक ठंडे देखने योग्य लौटाती है जो executed on every subscribe प्राप्त करती है, आप इसे एक गर्म अवलोकन में परिवर्तित करना चाहते हैं जो केवल पहले सब्सक्राइब पर निष्पादित हो जाती है और बाद में सदस्यता के लिए समान मान साझा करती है।

यह सब आप क्या करना है परिवर्तित करने के लिए share है यह:

return this._http.post(this.createURL(this.getCreateURL(), [], params), body, options) 
.map(res => this.handleObjectResponse(res)) 
.share(); 
+1

इस टिप्पणी ने वास्तव में मुझे कोणीय 2 के नवीनतम आरसी में एक और समस्या को ठीक करने में मदद की। धन्यवाद दोस्त। अवलोकन एक सुंदर अवधारणा है, लेकिन अंदर आने के लिए थोड़ा मुश्किल है। –

+3

फिर उन्हें गैर-मुश्किल कोड के साथ प्रतिस्थापित किया जाना चाहिए क्योंकि "मुश्किल" पीछे जा रहा है, चीजों को और भी खराब कर रहा है, बनाम –

+3

पूरी तरह से काम कर रहा है, इसलिए मुझे लगता है कि http कॉल के बाद हमेशा शेयर() डालना एक अच्छा अभ्यास है यदि आप इसे विधि से वापस करते हैं –

0

यह मेरे लिए हो रहा था क्योंकि मैं एक फार्म के इनपुट क्षेत्रों में से एक पर (key.enter)="someSubmitFunction()" है। जब मैंने इस क्षेत्र में प्रवेश किया तो फॉर्म दो बार सबमिट करेगा। जाहिर है, इसकी आवश्यकता नहीं थी। जब मैंने इसे हटा दिया, तो फॉर्म तब भी सबमिट होगा जब मैं एंटर दबाता हूं, लेकिन अब केवल एक बार।

0
its happening because HTTP OPTIONS executed first, and you have to restrict unwanted HTTP method before executing your Logic, always use isset method,see example below 

if(isset($_POST)) 
{ 
    $name = $_POST["name"]; 
    $country = $_POST["country"]; 

    $sql = 'INSERT INTO user values("' . $name . '","' . $country . '")'; 

      if ($conn->query($sql)=== TRUE) 
      { 
       $outp = "Inserted " . $name . " and " . $country; 
       echo json_encode($outp); 
      } else { 
       echo json_encode("Error: " . $sql . "<br>" . $conn->error); 
      } 
     } 


here it will insert row in table only when its POST METHOD.