2016-11-23 10 views
7

मुझे एक समस्या है जहां Angular2 एक ही अनुरोध दो बार करता है। मुझे नहीं पता क्यों, हालांकि, क्योंकि मेरे पास पर्यवेक्षण पर केवल एक बार सदस्यता है। यहाँ मेरी कोड है:कोणीय 2 अनुरोध दो बार किया गया है

मेरी सेवा इस तरह दिखता है:

getProjects(): Observable<Project[]> { 
    return this.http.get(this.url) 
     .map(this.mapProjects) 
     .catch(this.handleError); 
} 

private mapProjects(response: Response): any { 
    const mappedProjects = response.json(); 
    return mappedProjects; 
} 

मेरे घटक इस तरह दिखता है:

export class ProjectListComponent implements OnInit { 

// List of projects 
listProjects: Project[] = []; 

constructor(private projectListService: ProjectListService) { 
} 

public getProjectList() { 
    this.projectListService.getProjects() 
     .subscribe(
     projects => { 
      this.listProjects = projects; 
     }, 
     error => { 
      // error handling 
     }); 
} 
} 

Chrome डेवलपर टूल मैं देख रहा हूँ अनुरोध किए जाने के नेटवर्क टैब में दो बार, शुरुआतकर्ता zon.js है, दूसरी बार यह सिर्फ "अन्य" कहता है। क्या कोई इस व्यवहार को समझा सकता है?

+0

जो आप वर्णन कर रहे हैं वह ब्राउज़र द्वारा किए गए प्रीफलाइट अनुरोध की तरह दिखता है जो कोणीय नहीं है। [कृपया इस सवाल की जांच करें] (http://stackoverflow.com/questions/1256593/why-am-i-getting-an-options-request-instead-of-a-get-request)। यह सत्यापित करने के लिए कि यह एक प्रीफलाइट अनुरोध है, पहले अनुरोध की विधि 'विकल्प' होगी, दूसरा 'GET' – Abdulrahman

+1

अच्छी टिप्पणी होगी - क्या यह 2 जीईटी अनुरोध है या एक अनुरोध अनुरोध के बाद एक विकल्प अनुरोध है, यदि बाद में abdul सही है, हालांकि मुझे यकीन नहीं है कि अनुरोध प्रीफलाइट अनुरोध करते हैं?! * – danday74

+0

यह एक विकल्प अनुरोध नहीं है, यह दो बार अनुरोध है। –

उत्तर

6

मुझे लगता है कि preflight अनुरोध है। ये वास्तविक अनुरोध से पहले किए जाते हैं। आपके प्रीफलाइट प्रतिक्रिया को वास्तविक अनुरोध के लिए इन शीर्षकों को स्वीकार करने की आवश्यकता है। एक बार जब आप प्रीफलाइट अनुरोध पर यह प्रतिक्रिया भेजते हैं, तो ब्राउज़र वास्तविक अनुरोध करेगा। https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests

0
यकीन नहीं

अपने पूरे codebase देखे बिना, लेकिन यह इसे ठीक होगा ...

.getProjects().first().subscribe( ... etc 

आप

import 'rxjs/add/operator/first'; 

जोड़ने के लिए पहला ऑपरेटर की आवश्यकता होगी सुनिश्चित सदस्यता केवल एक बार कहा जाता है। हालांकि, अगर आपको इसे कई बार कहा जाता है (उदाहरण के लिए जब कोई घटना होती है) तो यह आपका समाधान नहीं होगा।

पीएस सब्सक्राइब हर बार पर्यवेक्षण धारा उत्सर्जित होता है। यदि स्ट्रीम दो बार उत्सर्जित हो रही है तो सब्सक्राइब को दो बार बुलाया जाता है। आप को देखने के लिए क्या यह करते हैं() का उपयोग कर उत्सर्जित करती है

यह इसे दो बार करता है, तो कहेंगे ...

1 नमूदार डीबग कर सकते हैं - आप दो बार सदस्यता लें और यह एक बार का उत्सर्जन करता है, सुनिश्चित करें कि आप बुला नहीं कर रहे हैं सदस्यता ले कर अधिक से

एक बार

2 - यह दो बार का उत्सर्जन करता है

1

कोड मैं केवल अनुमान लगा सकते हैं कि आपके घटक रूटर द्वारा खोला जाता है, और आप एक समाधानकर्ता कि getProjects invokes कॉन्फ़िगर कर दिया है देखकर बिना()। ऐसे मामले में संकल्प पूरी तरह से getProjects() द्वारा लौटे पर्यवेक्षकों की सदस्यता लेता है। इसलिए आपके पास सब्सक्राइब() के दो आमंत्रणों के साथ एक स्थिति है: एक स्पष्ट और एक अंतर्निहित।

+0

इस स्पष्ट और निहित संचार को कैसे जांचें क्योंकि मैं भी इस समस्या में आया हूं। – Rohitesh

संबंधित मुद्दे