2016-07-12 5 views
15

let ऑपरेटर का उदाहरण और स्पष्टीकरण (https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/let.md) स्पष्ट नहीं है। किसी के पास एक अच्छा उदाहरण/स्पष्टीकरण है कि let ऑपरेटर कैसे काम करता है, और जब हमें इसका उपयोग करना चाहिए?Rx.Observable.prototype.let ऑपरेटर का उपयोग कैसे करें?

उत्तर

39

&tldr;

यह तर्क compartmentalize और एक पाइप लाइन को इसकी सुई करने में सक्षम होने के लिए एक सुविधा कार्य है।

अधिक व्याख्या की

source शायद सबसे निश्चित व्याख्या है। यह वास्तव में सिर्फ एक समारोह गुजर रहा है जिसे स्रोत Observable के साथ बुलाया जाता है।

Rx.Observable.prototype.let = function(fn) { 
    return fn(this); 
} 

इस की उपयोगिता है कि हम बना सकते हैं या एक पाइप लाइन है कि आप एक से अधिक स्रोतों के लिए पुन: उपयोग करना चाहते हैं पूर्व परिभाषित है। आरएक्स, प्रतिक्रियाशील खोज पट्टी के लिए एक आम खीस्तयाग पर विचार करें:

// Listen to a key up event on the search bar 
// and emit the value of the search 
Rx.Observable.fromEvent(searchBar, 'keyup', e => e.target.value) 
    // Don't search too eagerly 
    .filter(text => text.length > 3) 
    .debounceTime(500) 
    //Search logic 
    .flatMap(text => $.getJSON(`my/search/api?q=${text}`)) 
    .flatMap({results} => results) 
    //Handler 
    .subscribe(appendToList); 

ऊपर कैसे एक पाइप लाइन बनाया जा सकता है की संरचना की एक बुनियादी समझ देना चाहिए। अगर हम कोड को साफ करने या इसे कहीं और इस्तेमाल करने में सक्षम होने के लिए इस तर्क में से कुछ को कोशिश करना और अमूर्त करना चाहते हैं तो यह थोड़ा मुश्किल हो सकता है, क्योंकि इसका आमतौर पर एक नया ऑपरेटर बनाना होता है (और इसका अपना सिरदर्द होता है)।

समाधान सामान्य तर्क को एक फ़ंक्शन में खींचने का अपेक्षाकृत सरल दृष्टिकोण है जिसे स्रोत Observable पारित किया जा सकता है और उस तर्क के साथ एक नया Observable वापस कर देगा।

तो ऊपर हो सकता है:

//Defined in pipelines.js 
function filterBuilder(minText, debounceTime) { 
    return (source) => 
    source.filter(text => text.length > minText) 
      .debounce(debounceTime); 
} 

function queryBuilder(baseUrl) { 
    return (source) => 
    source.flatMap(text => $.getJSON(`${baseUrl}?q=${text}`)) 
      .flatMap({results} => results); 
} 


//In your application code 

Rx.Observable.fromEvent(searchBar, 'keyup', e => e.target.value) 
    .let(filterBuilder(3, 500)) 
    .let(queryBuilder('my/search/api')) 
    .subscribe(appendResults); 
+1

ऐसा लगता है let' तरह '' को select' है के रूप में '' switchMap' map' है। फिर भी, 'select'' map' है, तो 'switchMap' से अलग 'let' कैसे है? –

+3

@ जॉन क्रिस्टोफर जोन्स वास्तव में नहीं। एक के लिए, 'चयन करें' और 'नक्शा' एक ही कार्य हैं जो एक दूसरे के उपनाम हैं। 'चलो' कुछ अमूर्त 'स्रोत' के आधार पर आपको पाइपलाइन को परिभाषित करने की अनुमति देकर, स्पष्ट रूप से चिंताओं को अलग करने के बारे में है और फिर इसे ठोस स्रोत में प्लग करें। – paulpdaniels

+1

धन्यवाद। मैं [github.com/ngrx/example-app] में चयनकर्ता पैटर्न के उदाहरणों में उपयोग किए गए 'चयन' और 'let' दोनों को देख रहा हूं और इसके चारों ओर अपने सिर को लपेट नहीं रहा हूं। इसलिए, jQuery शब्दों में, 'let' सचमुच विधि का आह्वान करने का तरीका है, जिससे आप विधि श्रृंखलाओं के अनुभागों को पैरामीटर कर सकते हैं। या, इसे 'स्विचमैप' से तुलना करने के लिए, आपके द्वारा पारित किए गए फ़ंक्शंस दोनों को अवलोकन करने चाहिए, लेकिन 'स्विचमैप' स्ट्रीम सदस्यों को प्राप्त करता है और 'चलो' स्ट्रीम को स्वयं प्राप्त करता है। –

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