2017-08-23 13 views
7

जब मैं कोणीय 4 में http सेवा के माध्यम से कई http अनुरोध करने के लिए प्रयास करते हैं, पिछले अनुरोध क्रोम में रद्द कर दिया हो (लेकिन वे सर्वर तक पहुंचने)। उदाहरण:कोणीय 4. HTTP अनुरोध की एक श्रृंखला को रद्द कर दिया हो

const obs1 = this.http.get(`${API_URL}/transitions`); 
const obs2 = this.http.get(`${API_URL}/states`); 
obs1.subscribe(); 
obs2.subscribe(); // this will cancel obs1's http request 

लेकिन अगर मैं ऊपर की तरह .publish().connect() को .subscribe() की जगह, इसे सही ढंग से काम करेंगे (कोई रद्द)

const obs1 = this.http.get(`${API_URL}/transitions`); 
const obs2 = this.http.get(`${API_URL}/states`); 
obs1.publish().connect(); 
obs2.publish().connect(); 

या अगर मैं दो Observables एक और फिर विलय ऊपर की तरह सदस्यता ली हो, यह भी सही ढंग से काम करेगा

const obs1 = this.http.get(`${API_URL}/transitions`); 
const obs2 = this.http.get(`${API_URL}/states`); 
Observable.merge(obs1, obs2).subscribe() 

मुझे इस व्यवहार का सामना क्यों करना है? मुझे समझने की जरूरत है, बाईपास नहीं। मैं कैसे विलय बिना अनुरोध की श्रृंखला बना सकते हैं, forking आदि?

उत्तर

6

मैं इस व्यवहार का एक संभावित कारण मिल गया है।

https://github.com/ghetolay और https://github.com/dklmuc

के लिए धन्यवाद हम पता चला कि कोणीय बहुत तेजी से HTTP अनुरोध है जो किसी भी कॉलबैक बिना रद्द हो जाएगा।) टियरडाउन

पर यदि कनेक्शन

ठीक यह रेस स्थिति मुझे लगता है कि

यह हमेशा xhr.abort कॉल करेंगे (: तो, आप onNext पारित करने के लिए सदस्यता ले

https://github.com/ghetolay से है अभी भी ब्राउज़र द्वारा इसे खोल दिया जाता है, इसे बंद कर देगा, अन्यथा शायद कुछ भी नहीं कर रहा है

इसलिए जब आपके पास प्रतिक्रिया का बहुत तेज़ प्रबंधन होता है (जैसे कॉलबैक नहीं वास्तव में बहुत तेजी से होता है) यह कनेक्शन है कि अभी भी खुला माना जाता है गर्भपात हो सकता है

यह एक सही ढंग से काम करता है:

for (let i = 1; i < 50; i++) { 
    http.get(`https://swapi.co/api/people/${i}`).subscribe((result) => { 
     console.log(i, result); 
    }); 
} 
+0

अब मुझे बुरा लगता है, क्योंकि मैं इसके बारे में टिप्पणी करने जा रहा था लेकिन सिर्फ यह मान लिया कि आपका उदाहरण सरलीकृत है। यदि आपको सदस्यता के बिना http अनुरोध निष्पादित करने की आवश्यकता है। आप 'http.get (...) को कॉल कर सकते हैं। (1) 'ले लें जो पहले आइटम के बाद सदस्यता को सब्सक्राइब और नष्ट कर देगा। – cgTag

+0

@ctTag क्या है (1) सब्सक्राइब विधि के बिना अनुरोध घटना का आह्वान करेगा? – WimmDeveloper

+0

@ctTag नहीं, यह नहीं होगा। अभी जांच की गई लेकिन मुझे अभी एहसास हुआ है कि http विधियों के लिए '.take (1) ' – WimmDeveloper

0

यह observables से कोई लेना देना नहीं है रद्द किया जा रहा है, हालांकि मैं मानता चाहिए मैं नहीं जानता आपके सामने आने वाली समस्या का मूल कारण।

मैं ngrx/प्रभाव मॉड्यूल का उपयोग कर एक ऐसी ही समस्या हुई थी। एक्शन हैंडलर ने एनजीआरएक्स स्विच मैप ऑपरेटर का उपयोग करके एक सेवा के लिए अनुरोध किए। अंतिम अनुरोध को छोड़कर सभी को रद्द कर दिया जाएगा। मानचित्र को मर्ज करने के लिए इसे बदलना समस्या को हल करता है। नीचे कोड

@Effect() 
    loadSomeData$: Observable<Action> = this.actions$ 
      .ofType(SomeActions.Load_Data) 
      .mergeMap((id) => 
        this.someService.getSomething(id) 
          .map((someEntity) => new SomeActions.LoadDataSuccess(someEntity) 
          ).catch((x, y) => { 
            console.error('Error occured'); 
            return Observable.of(new SomeActions.LoadDataFailed(id)); 
          } 
          )); 

यहाँ ngrx की प्रासंगिकता का Reproducing है।

https://www.learnrxjs.io/operators/transformation/switchmap.html

switchMap और अन्य सपाट ऑपरेटरों के बीच मुख्य अंतर रद्द प्रभाव है। प्रत्येक उत्सर्जन पर पिछले आंतरिक अवलोकन (आपके द्वारा प्रदान किए गए फ़ंक्शन का परिणाम) रद्द कर दिया गया है और नया अवलोकन योग्य है। आप इसे एक नए अवलोकन करने के लिए वाक्यांश स्विच द्वारा याद कर सकते हैं।

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