2015-01-23 7 views
11

मैं इस ट्यूटोरियल http://reactive-extensions.github.io/learnrx/ पढ़कर RxJS सीख रहा हूं।आरएक्सजेएस में 'मानचित्र' विधि का क्या अर्थ है?

मुझे Observable की विधि को समझने में कठिनाई है। Arraymap का संस्करण वास्तव में सरल और सीधा है। मुझे map का अर्थ Observable के मामले में नहीं है (और इसका नाम उपनाम select क्यों है?) के बारे में मुझे कोई जानकारी नहीं है।

दस्तावेज ने मुझे बताया है। सबसे शुरुआती के लिए उपयोगी नहीं हो सकता है ...

परियोजनाओं तत्व के सूचकांक को शामिल करके एक नए रूप में एक नमूदार अनुक्रम के प्रत्येक तत्व। यह चुनिंदा विधि के लिए एक उपनाम है।

मुझे event के संदर्भ में map समझ में नहीं आता है। उदाहरण के लिए, नीचे दिया गया कोड ठीक वही काम करता है जो मैंने अपेक्षित था। मैंने कोड के इस टुकड़े के बारे में सोचा था: " की घटना-स्ट्रीम से click-event को सुनें"।

var btnClicks, observable; 
 

 
btnClicks = Rx.Observable.fromEvent($('#btn'), "click"); 
 

 
observable = btnClicks.subscribe(function(e) { 
 
\t console.log(e); 
 
});

लेकिन क्या होता है जब यह यह करने के लिए हो जाता है ??

var btn2Clicks, btnClicks, observable; 
 

 
btnClicks = Rx.Observable.fromEvent($('#btn'), "click"); 
 

 
btn2Clicks = Rx.Observable.fromEvent($('#btn2'), "click"); 
 

 
observable = btnClicks.map(function(e) { 
 
    return btn2Clicks; 
 
}).subscribe(function(e) { 
 
    console.log(e); 
 
});

मैं क्या सोचा map का उपयोग घटना-संग्रह का एक और संग्रह पर क्लिक-घटना का एक संग्रह को बदलने के लिए है। filter समझना आसान है, जैसे कि filter शब्द का अर्थ है, केवल उस ईवेंट को लें जो मुझे रूचि है, और दूसरों को छोड़ दें। लेकिन event के संदर्भ में map के बारे में कैसे? यदि इसका मतलब है 'सरणी संस्करण के रूप में एक संग्रह को दूसरे में परिवर्तित करें', तो यह अभी भी क्यों आग लगती है जब #btn क्लिक किया गया ??

मेरा मतलब है कि मैंने इसे किसी अन्य संग्रह में मैप किया है, अब यह #btn पर क्लिक-इवेंट का संग्रह नहीं है, लेकिन यह कुछ नया संग्रह है ... लेकिन यह अभी भी आग लगती है जब #btn क्लिक किया गया जो मेरे लिए समझ में नहीं आता ।

उत्तर

18

map अवलोकन के लिए बिल्कुल वही काम करता है जैसा कि यह सरणी के लिए करता है। विभिन्न वस्तुओं के संग्रह में वस्तुओं का संग्रह बदलने के लिए आप map का उपयोग करते हैं। अगर आप पर्यवेक्षक के दृष्टिकोण से कम से कम वस्तुओं के संग्रह के रूप में एक अवलोकन के बारे में सोचते हैं (जैसे सरणी भी वस्तुओं का संग्रह है) में मदद करता है।

function multiplyByTwo(collection) { 
    return collection.map(function (value) { 
     return value * 2; 
    }); 
} 

function removeZeroes(collection) { 
    return collection.filter(function (value) { 
     return value !== 0; 
    }); 
} 

var a = [1, 2, 3, 4, 0, 5]; 
var b = multiplyByTwo(a); // a new array [2, 4, 6, 8, 0, 10] 
var c = removeZeroes(b); // a new array [2, 4, 6, 8, 10] 

आप एक नमूदार के लिए इन ही कार्य उपयोग कर सकते हैं:

var a = Rx.Observable.of(1, 2, 3, 4, 0, 5); 
var b = multiplyByTwo(a); // a new observable [2, 4, 6, 8, 0, 10] 
var c = removeZeroes(b); // a new observable [2, 4, 6, 8, 10] 

इसका कारण यह है संभव है

उदाहरण के लिए, इन 2 तरीकों है कि आप कुछ सरणियों के साथ उपयोग करने के लिए लिखा था ले आरएक्सजे के अवलोकन, सरणी ऑपरेटरों जैसे map और filter को लागू करते हैं ताकि सटीक वही अर्थशास्त्र हो जो वे सरणी के लिए करते हैं। यदि आप जानते हैं कि वे सरणी के लिए कैसे काम करते हैं, तो आप जानते हैं कि वे अवलोकन के लिए कैसे काम करते हैं।

यह चाल dual nature of observables and enumerables का परिणाम है।

यदि आप इंटरैक्टिव ट्यूटोरियल के माध्यम से काम करते हैं तो आप वास्तव में इस प्रक्रिया के माध्यम से चलते हैं। मेरा मानना ​​है कि यह आपको एरे के लिए मैप ऑपरेटरों को लिखकर शुरू कर देता है और फिर बाद के ट्यूटोरियल में स्रोत के रूप में एक अवलोकन कर देता है।

पीएस यह इतिहास के कारण select के लिए उपनाम है: प्रतिक्रियाशील एक्सटेंशन पहले .NET में लागू किया गया था और बाद में अन्य भाषाओं में पोर्ट किया गया था। Rx.NET उसी ऑपरेटरों का उपयोग करता है जिनका उपयोग .NET के LINQ द्वारा किया जाता है (IObservableIEnumerable का दोहरी है)। LINQ के मानचित्र ऑपरेटर को Select के रूप में जाना जाता है (और इसके फ़िल्टर ऑपरेटर को Where के रूप में जाना जाता है)। ये नाम LINQ की उत्पत्ति से आते हैं। LINQ का निर्माण करने के लक्ष्यों में से एक था सी # में डेटाबेस क्वेरी लिखना संभव था। इस प्रकार उन्होंने कई ऑपरेटरों के लिए एसक्यूएल नामकरण सम्मेलनों को अपनाया (LINQ SELECT नक्शे सीधे एसक्यूएल चयन, LINQ जहां एसक्यूएल के लिए मानचित्र कहां इत्यादि)।

+0

धन्यवाद! अब मुझे पता है कि कुछ विधियों में उपनाम क्यों है। लेकिन मैं अभी भी 'event' के संदर्भ में 'मानचित्र' ऑपरेशन को नहीं समझ सकता। मैंने सवाल संपादित किया, उम्मीद है कि आप मुझे जवाब दे सकते हैं कि घटनाओं से निपटने के दौरान मानचित्र का क्या अर्थ है। – yaquawa

+0

@ ब्रैंडन लेकिन मानचित्र कब काम करता है? मेरा मतलब है, जब आप किसी सरणी पर मैप करते हैं, तो आपके पास पहले से ही सरणी में सभी तत्व होते हैं और यह प्रत्येक तत्व के माध्यम से लॉग (एन) बार को पुन: सक्रिय करता है। जब आप एक अवलोकन पर मैप करते हैं, तो अवलोकन करने योग्य पहले से ही सभी तत्व प्राप्त करता है (और यह उनमें से प्रत्येक के माध्यम से पुनरावृत्त होता है) या कार्य (नक्शा ब्लॉक के अंदर) प्रत्येक तत्व (घटना) पर चलने पर काम करता है? तो पर्यवेक्षकों के लिए, नक्शा एक इटरेटर के रूप में कार्य करता है (जैसे यह सामान्य सरणी के लिए करता है) या प्रत्येक ईवेंट (तत्व) के माध्यम से गुजरने के लिए एक सजावट के .map अधिक है? –

+0

@ बेंजामिनएमसीफेरेन ऑब्जर्वेबल पुश-आधारित हैं (स्रोत * धक्का * ग्राहकों को डेटा (डेटा के रूप में किसी भी ऑपरेटरों के माध्यम से) जैसे डेटा उपलब्ध हो जाता है)। तो, हां, आपके अनुष्ठान में, पर्यवेक्षक ऑपरेटरों घटना सजावट की तरह हैं। – Brandon

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