2016-07-26 27 views

उत्तर

35

(नोट: RX.DOM.ajax RxJS v4 से है, और redux-observable जो RxJS v5 की आवश्यकता के साथ काम नहीं करता है v5 में बराबर Rx.Observable.ajax या import { ajax } from 'rxjs/observable/ajax'; है।)

यह वास्तव में किसी भी रूप में fetch() उपयोग करने के लिए और साथ ही संभव है अन्य AJAX एपीआई; हालांकि कुछ दूसरों के मुकाबले आसान है!

fetch() एपीआई एक Promise, जो v5 RxJS देता है निर्मित के लिए समर्थन करते हैं। अधिकांश ऑपरेटर जो एक अवलोकन योग्य उम्मीद करते हैं, वे वादा का उपभोग कर सकते हैं (जैसे mergeMap, switchMap, आदि)। लेकिन अक्सर आप आरएक्स ऑपरेटर को अपने बाकी एपिक के साथ पास करने से पहले वादा करने के लिए आवेदन करना चाहते हैं, इसलिए आप प्रायः वादे को एक अवलोकन के अंदर लपेटना चाहेंगे।

आप Observable.from(promise)

यहाँ के साथ एक नमूदार में एक वादा लपेट कर सकते हैं एक उदाहरण है जहां मैं एक उपयोगकर्ता के लिए लाने, JSON उत्तर का अनुरोध है, तो एक नमूदार में वादा लपेट:

const api = { 
    fetchUser: id => { 
    const request = fetch(`https://jsonplaceholder.typicode.com/users/${id}`) 
     .then(response => response.json()); 
    return Observable.from(request); 
    } 
}; 

फिर आप अपने एपिक में उपभोग कर सकते हैं और अपने इच्छित ऑपरेटर को लागू कर सकते हैं:

const fetchUserEpic = action$ => 
    action$.ofType(FETCH_USER) 
    .mergeMap(action => 
     api.fetchUser(action.payload) // This returns our Observable wrapping the Promise 
     .map(payload => ({ type: FETCH_USER_FULFILLED, payload })) 
    ); 

यहां एक इस काम कर उदाहरण के साथ JSBin: https://jsbin.com/fuwaguk/edit?js,output


आप एपीआई कोड पर नियंत्रण है, तो आदर्श आप Observable.ajax (या किसी अन्य प्रत्यक्ष आधारित AJAX utils) का प्रयोग करेंगे क्योंकि वादे रद्द नहीं किया जा सकता है। (इस लेखन के रूप में)

+0

धन्यवाद, जय, स्पष्टीकरण के लिए! – zatziky

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