2015-01-23 23 views
11

tôi đang học RxJS bằng cách đọc hướng dẫn này http://reactive-extensions.github.io/learnrx/.Phương thức `map` có nghĩa là gì trong RxJS?

Tôi khó có thể hiểu được phương thức map của Observable. Phiên bản Array của map thực sự đơn giản và dễ hiểu. Tôi không có ý tưởng về những gì chính xác map nghĩa trong trường hợp của một Observable (và tại sao nó có một bí danh tên select?!).

Dưới đây là những gì các tài liệu hướng dẫn nói với tôi. Có thể không hữu ích cho hầu hết người mới bắt đầu ...

Chiếu từng phần tử của một chuỗi quan sát thành một biểu mẫu mới bằng cách kết hợp chỉ mục của phần tử. Đây là bí danh cho phương thức chọn.

Tôi không hiểu map trong ngữ cảnh event. Ví dụ: mã bên dưới hoạt động chính xác những gì tôi mong đợi. Tôi nghĩ đến đoạn mã này như sau: "Nghe click-event từ sự kiện-stream của #btn".

var btnClicks, observable; 
 

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

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

Nhưng điều gì sẽ xảy ra khi nó trở nên để điều này ??

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); 
 
});

Những gì tôi nghĩ là sử dụng map để biến đổi một bộ sưu tập của một nhấp sự kiện vào một bộ sưu tập của sự kiện thu. Các filter là dễ hiểu, nó cũng giống như từ filter phương tiện, đi sự kiện duy nhất tôi quan tâm, và bỏ qua những người khác. Nhưng làm thế nào về map trong bối cảnh event? Nếu nó có nghĩa là 'chuyển đổi một bộ sưu tập sang một bộ sưu tập khác' giống như phiên bản mảng, tại sao nó vẫn cháy khi #btn nhấp vào ??

Ý tôi là tôi đã lập bản đồ cho một bộ sưu tập khác, bây giờ nó không còn là bộ sưu tập của sự kiện nhấp chuột #btn mà là bộ sưu tập mới của một thứ gì đó ... Nhưng nó vẫn cháy khi #btn nhấp vào không hợp lý với tôi .

Trả lời

18

map hoạt động chính xác như nhau đối với Quan sát giống như đối với mảng. Bạn sử dụng map để chuyển đổi tập hợp các mục thành một tập hợp các mục khác nhau. Nó sẽ giúp nếu bạn nghĩ về một Observable như một tập hợp các mục (giống như một mảng cũng là một tập hợp các mục), ít nhất là từ quan điểm của người quan sát.

Ví dụ, có những 2 phương pháp mà bạn đã viết để sử dụng với một số mảng:

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] 

Bạn có thể sử dụng các giống chức năng cho một quan sát được:

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] 

Điều này có thể vì Các quan sát của RxJ thực hiện các toán tử mảng như mapfilter để có cùng ngữ nghĩa giống như chúng làm cho các mảng. Nếu bạn biết cách họ làm việc cho mảng, thì bạn biết cách họ làm việc cho các quan sát.

Bí quyết này là kết quả của dual nature of observables and enumerables.

Nếu bạn làm việc qua hướng dẫn tương tác mà bạn đang xem, nó thực sự hướng dẫn bạn qua quá trình này. Tôi tin rằng nó bắt đầu bạn bằng cách viết các toán tử bản đồ cho mảng và sau đó trong một hướng dẫn sau đó lẻn một quan sát trong như là nguồn.

P.S. Đây là bí danh cho select vì lịch sử của nó: Tiện ích mở rộng phản ứng được triển khai lần đầu tiên trong .NET và sau đó được chuyển sang các ngôn ngữ khác. Rx.NET sử dụng cùng một toán tử được sử dụng bởi LINQ của .NET (từ IObservable là số kép của IEnumerable). Toán tử bản đồ của LINQ được gọi là Select (và toán tử lọc của nó được gọi là Where). Những cái tên này đến từ nguồn gốc của LINQ. Một trong những mục tiêu khi LINQ được xây dựng là làm cho nó có thể viết các truy vấn cơ sở dữ liệu trong C#. Vì vậy, họ đã thông qua các quy ước đặt tên SQL cho nhiều toán tử (LINQ SELECT ánh xạ trực tiếp tới SQL SELECT, LINQ WHERE ánh xạ tới SQL WHERE, v.v.).

+0

Cảm ơn! Bây giờ tôi biết lý do tại sao một số phương pháp có một bí danh. Nhưng tôi vẫn không thể hiểu được thao tác 'map' trong ngữ cảnh' sự kiện'. Tôi đã chỉnh sửa câu hỏi, hy vọng bạn có thể trả lời cho tôi ý nghĩa của bản đồ khi xử lý các sự kiện. – yaquawa

+0

@Brandon nhưng khi nào chức năng bản đồ lặp lại? Ý tôi là, khi bạn ánh xạ trên một mảng, bạn đã có tất cả các phần tử trong mảng và nó lặp lại các log (n) lần qua từng phần tử. Khi bạn .map trên một Observable, có quan sát đã nhận được tất cả các phần tử (và nó lặp qua mỗi phần tử) hay các hàm (bên trong khối bản đồ) hoạt động trên mỗi phần tử (sự kiện) khi nó đến? Vì vậy, đối với Observables, bản đồ có hoạt động như một trình lặp (giống như nó làm cho các mảng bình thường) hay là .map hơn một trình trang trí cho mỗi sự kiện (phần tử) đi qua? –

+0

@BenjaminMcFerren Quan sát được dựa trên đẩy (nguồn * đẩy * dữ liệu tới người đăng ký (thông qua bất kỳ toán tử nào như 'bản đồ') khi dữ liệu có sẵn). Vì vậy, có, trong cách nói của bạn, các nhà khai thác quan sát giống như trang trí sự kiện. – Brandon

Các vấn đề liên quan