[MUSIC]
Bây giờ hãy để tôi cung cấp cho bạn một cái nhìn tổng quan nhanh chóng về Angular và
mối quan hệ của nó với chương trình phản ứng,
làm thế nào để Angular sử dụng các lập trình phản ứng.
Đặc biệt, thư viện RxJS và cách nó được tận dụng bởi
Angular để cung cấp một cách phản ứng của việc viết các ứng dụng Angular.
Bây giờ những gì chúng ta trình bày trong bài giảng này là một cái nhìn tổng quan rất nhanh về
khái niệm tổng quát về lập trình phản ứng, quan sát được,
mô hình quan sát và cách nó được áp dụng trong Angular.
Lập trình phản ứng tự nó là một
chủ đề rất rộng lớn mà không thể được đề cập trong mười phút.
Lập trình phản ứng,
nếu tôi cần phải trang trải nó một cách chi tiết sẽ trở thành toàn bộ khóa học theo quyền riêng của mình.
Và thật không may,
chúng tôi không có thời gian để nhúng toàn bộ khóa học vào khóa học cụ thể này.
Vì vậy, với thực tế là chúng tôi quan tâm chủ yếu đến cách Angular tận dụng
lập trình phản ứng để cho phép chúng tôi tăng gấp đôi lên các ứng dụng Angular,
vì vậy chúng tôi sẽ tập trung vào khía cạnh đó.
Nhưng trên đường đi,
tôi sẽ cung cấp cho bạn một giới thiệu nhanh về các khái niệm khác nhau trong lĩnh vực chung này.
Nếu bạn quan tâm đến lập trình phản ứng,
tôi sẽ khuyên bạn nên theo đuổi một số liên kết mà tôi đã cung cấp và các
nguồn lực bổ sung cho bài học cụ thể này.
Bạn có thể truy cập vào rất nhiều tài liệu ngoài kia, nhưng
chúng tôi sẽ cung cấp cho bạn một nền tảng vững chắc trong lập trình phản ứng.
Nhưng trong khóa học này, từ thời điểm này trở đi,
chúng ta sẽ xem xét cách Angular tận dụng mô hình lập trình phản ứng để
thiết kế các ứng dụng Angular.
Chúng tôi không chỉ giới hạn cho bài học này, nhưng
tất cả các bài học tiếp theo cũng sẽ thấy Sử dụng các
mô hình quan sát và quan sát và cách chúng tôi viết các ứng dụng phản ứng trong góc cạnh.
Toàn bộ cuộc thảo luận về lập trình phản ứng xoay quanh
mô hình kỹ thuật phần mềm đặc biệt này được gọi là mô hình quan sát được.
Bạn nhớ lại băng nhóm bốn mà tôi đã đề cập đến bạn trong một trong những
bài giảng trước đó, nơi chúng tôi đã thảo luận về khung điều khiển xem mô
hình và khung mô hình xem mô hình.
Cùng một băng nhóm bốn cuốn sách chứa một số mô hình
đã được sử dụng khá thành công trong mô hình lập trình phản ứng.
Mô hình quan sát viên xoay quanh những người quan sát được.
Vì vậy, bạn có thể quan sát, hành vi của họ có thể được quan sát bởi các nhà quan sát.
Vì vậy, đó là lý do tại sao điều này được gọi là mô hình quan sát viên.
Bạn khai báo một số đối tượng là có thể quan sát được hoặc các đối tượng và
những quan sát này sẽ được quan sát bởi các quan sát viên.
Bây giờ, chính các quan sát viên sẽ đăng ký để
xem các thay đổi trong quan sát được và quan sát được
sẽ thông báo cho các quan sát viên bất cứ khi nào thay đổi xảy ra.
Vì vậy, trong mô hình quan sát viên này, cách các nhà quan sát này sẽ đăng ký
với người quan sát được hoặc tự đăng ký với người quan sát được.
Vì vậy, đó là cách người quan sát biết những nhà quan sát nào quan tâm đến
bất kỳ thay đổi nào trong trạng thái của nó.
Vì vậy, do đó, bất cứ khi nào quan sát được nói,
thay đổi trạng thái của nó, nó sẽ ngay lập tức thông báo cho tất cả
các quan sát viên về sự thay đổi của nhà nước và các quan sát viên sau đó có thể
hành động dựa trên thông báo này về sự thay đổi trong quan sát.
Mô hình quan sát viên đã được sử dụng rất hiệu quả trong nhiều
hoàn cảnh khác nhau.
Và thực sự, mô hình lập trình phản ứng dựa trên nó.
Vì vậy, câu hỏi xuất hiện trong tâm trí của bạn ngay lập tức là
tại sao chúng ta nói về những người quan sát được?
Sự quan tâm đặc biệt về vật thể quan sát là gì?
Mô hình quan sát viên là một cách viết các ứng dụng phần mềm.
Vì vậy, điều này được dựa trên Streams.
Vì vậy, bạn có dữ liệu chảy ứng dụng của bạn.
Dữ liệu này có thể được xem như là một dòng giá trị chảy qua
ứng dụng của bạn.
Vì vậy, dòng suối là kênh chính xung quanh đó
có thể quan sát và mô hình quan sát được thiết kế.
Vì vậy, những luồng bạn có thể đăng ký vào các luồng này.
Và bất cứ khi nào một giá trị xuất hiện trên dòng suối, bạn sẽ nhận được giá trị đó và
sau đó bạn có thể phản ứng với giá trị đó.
Vì vậy, để có thể phản ứng với giá trị đó, bạn cần đăng ký luồng đó hoặc
bạn cần đăng ký để quan sát được.
Các quan sát sẽ thường xuyên tiếp tục phát ra các giá trị.
Và khi bạn nhìn thấy những giá trị đó, người quan sát có thể phản ứng với những giá trị đó.
Bây giờ điều này cũng có nghĩa là khi bạn không còn quan tâm,
bạn có thể hủy đăng ký mình từ một quan sát được.
Bạn có thể nói, tôi không hứng thú với việc nhìn bạn nữa và sau đó biến mất.
Vì vậy, mô hình quan sát cho phép bạn theo dõi định kỳ thay đổi,
nếu bạn muốn và sau đó ngừng quan sát khi bạn không còn quan tâm.
Vì vậy, kiểu mô hình đó cho phép bạn thiết kế các
ứng dụng phần mềm của mình theo một cách rất thú vị, một cách rất trực quan.
Nhưng để có thể sử dụng cách tiếp cận này,
bạn cần phải có được đầu của bạn xung quanh cách tiếp cận này.
Giống như chúng ta đã thấy với mô hình gọi lại hoặc chúng ta đã thấy với việc sử dụng các lời hứa.
Observables là một cách khác để thiết kế các ứng dụng.
Vì vậy, một quan sát của chính nó sẽ rất lười biếng và nó sẽ chỉ treo xung quanh đó.
Vì vậy, bạn có thể tạo ra một quan sát và sau đó chỉ cần để nó ở đó.
Người quan sát trở nên hoạt động hoặc
nó trở nên nóng khi ai đó bắt đầu đăng ký với người quan sát.
Vì vậy, tại thời điểm đó, người quan sát bắt đầu hành động và bắt đầu chỉnh sửa các giá trị.
Vì vậy, nếu ít nhất một quan sát viên được giao phó trong quan sát,
thì quan sát sẽ bắt đầu phát ra các giá trị.
Nếu không ai được ủy thác, quan sát được sẽ quay trở lại vỏ của nó và vẫn ở đó.
Vì vậy, bạn có thể nghĩ về nó theo cách đó.
Vì vậy, nếu hình ảnh tinh thần đó giúp bạn
hiểu được bằng sáng chế của người quan sát hoạt động như thế nào, thì cũng vậy.
Vì vậy, điều đó sẽ giúp bạn nhìn vào cách chúng tôi thiết kế các ứng dụng của chúng tôi
trong các bài tập tiếp theo và sau đó các bài học tiếp theo
mà chúng tôi kiểm tra HTTP hỗ trợ Angular chi tiết hơn.
Một khía cạnh khác của quan sát được là thực tế là hủy bỏ một yêu cầu trước
đó và sau đó thử lại là rất đơn giản với quan sát được.
Lời hứa mà bạn đã thấy trước đó, một khi bạn bắt đầu chờ đợi một lời hứa,
bạn không thể hủy bỏ, bạn đang chờ đợi.
Lời hứa cuối cùng sẽ giải quyết hoặc thất bại và
sau đó bạn phải phản ứng bất kể điều gì ngay cả khi bạn không còn quan tâm.
Nhưng với một quan sát được, nếu bạn có thể bán đăng ký của bạn,
thì những gì xảy ra với quan sát không phải là bất kỳ mối quan tâm nào đối với bạn cả.
Và vì vậy bạn không cần phải làm bất cứ điều gì, nếu bạn hủy đăng ký của mình.
Vì vậy, hủy bỏ và thử lại trong trường hợp thử nghiệm trước đó không
thành công là rất đơn giản với những người quan sát.
Chúng ta sẽ thấy một số hành vi này chi tiết hơn trong các bài tập tiếp theo.
Điều này đưa chúng ta đến khái niệm về lập trình phản ứng.
Lập trình phản ứng dựa trên mô hình quan sát viên và
cũng là một mô hình lặp lại.
Nhưng dù sao,
mô hình quan sát viên là đặc điểm chủ đạo của một lập trình phản ứng.
Vì vậy, trong lập trình phản ứng, chúng tôi quan tâm đến các luồng dữ liệu.
Cách dữ liệu chảy qua ứng dụng của bạn.
Bất kỳ luồng dữ liệu nào cũng có thể được coi là luồng.
Vì vậy, dòng dữ liệu này có thể truyền bá các thay đổi trong suốt ứng dụng của bạn.
Và trong khi những thay đổi đang được truyền bá thông qua các ứng dụng,
ở giai đoạn trung gian bạn thậm chí có thể lấy một luồng cụ thể,
sửa đổi nó và tạo ra một luồng khác đi ra từ đó.
Vì vậy, đó là những gì một mô hình quan sát cho phép chúng ta vẽ.
Vì vậy mà toàn bộ mô hình lập trình được xây dựng xung quanh các luồng hoặc các luồng dữ liệu.
Vì vậy, đây là một cách khác để xem xét giải quyết vấn đề của bạn.
Và đó là lý do tại sao tôi nhấn mạnh một thực tế là bạn cần phải có được đầu của bạn xung quanh để
hiểu làm thế nào các mô hình phản ứng hoặc cách lập trình phản ứng được thực hiện trong thực tế.
Bây giờ, bạn thường nghe người ta nói về một thứ gọi là
lập trình phản ứng chức năng.
Nếu bạn đã quen thuộc với mô hình lập trình chức năng.
Nhưng cộng với lập trình phản ứng
là những gì người ta thường tham khảo như là lập trình phản ứng chức năng.
Vì vậy, sự kết hôn giữa hai cách tiếp cận này.
Bây giờ, bạn sẽ thấy việc sử dụng một số trong số này với Angular
khi bạn đi qua khóa học đặc biệt này.
Cuối cùng, những gì về RxJS?
Nó đóng vai trò gì trong toàn bộ hệ sinh thái này?
RxJS là một thực hiện JavaScript của mô hình quan sát được và
cũng hỗ trợ cho lập trình phản ứng.
Vì vậy, nếu bạn đã làm lập trình phản ứng trong JavaScript,
sau đó bạn tận dụng thư viện RxJS để làm như vậy.
RxJS chỉ là một thực hiện như vậy.
Có một vài người khác nhưng lý do tại sao chúng tôi quan tâm đến RxJS đặc biệt
trong khóa học này là bởi vì Angular tận dụng RxJS cho
sự hỗ trợ của nó cho lập trình phản ứng.
Vì vậy, RxJS là một thư viện.
Nó là một thư viện riêng biệt mà là ngoài kia.
Bạn có thể sử dụng RXJS cho các mục đích khác cũng, không nhất thiết phải liên quan đến Angular.
Đã có những ứng dụng đã được phát triển bằng cách sử dụng RxJS per se
không liên quan đến Angular.
Nhưng trong khóa học này, chúng tôi quan tâm đến cách RxJS đi kèm với
Angular để hỗ trợ lập trình phản ứng trong Angular.
Vì vậy, có RxJS là một thư viện cho phép bạn làm lập trình không đồng bộ.
Chúng tôi đã nói về lập trình không đồng bộ hứa hẹn trước đó.
Chúng ta sẽ thấy lập trình không đồng bộ với callbacks trong khóa học nút.
Và quan sát được là một cách khác để xem xét lập trình
không đồng bộ, cùng với lập trình viên điều khiển sự kiện.
Vì vậy, nếu bạn đã quen thuộc với mô hình lập trình hướng sự kiện,
RxJS phù hợp ngay trong môi trường đó.
Toàn bộ điều được xây dựng xung quanh các trình tự quan sát được.
Và thư viện RxJS cung cấp cho bạn một loại lõi được gọi là Observable.
Và xung quanh loại lõi này, bạn có một số
loại vệ tinh được xây dựng gọi là quan sát viên, lập lịch trình, và các đối tượng.
Tất cả những điều này cho phép bạn lập trình phản ứng.
Hơn nữa, RxJS cũng hỗ trợ một loạt các toán tử.
Hỗ trợ các nhà khai thác, dấu tách, xin lỗi.
Đó là một cái lưỡi của tôi.
RxJS hỗ trợ các toán
tử, toán tử được lấy cảm hứng từ các toán tử mảng JavaScript.
Nếu bạn đã quen thuộc với các toán tử mảng JavaScript như bản đồ thì
các toán tử RxJS sẽ trông rất quen thuộc với bạn.
Bạn có thể đối xử với một quan sát và
các giá trị mà một hình ảnh quan sát giống như một mảng, vì vậy đó là lý do tại sao nhiều
nhà khai thác mảng tìm cách của họ vào RxJS và lập trình phản ứng cũng.
Vì vậy, người dùng lập bản đồ, lọc, giảm và
các toán tử mảng khác cũng sẽ tìm thấy một vị trí trong RxJS và lập trình phản ứng.
Và đây là những gì cho phép bạn xử lý các sự kiện không đồng bộ như các bộ sưu tập.
Vì vậy, khi bạn muốn chờ đợi
một sự kiện không đồng bộ, nó sẽ tương tự như đăng ký vào một quan sát được.
Vì vậy, khi quan sát được phát ra giá trị, bạn đã sẵn sàng để bắt được giá trị và
sau đó hành động phù hợp.
Bạn biết khi nào sự phát xạ đó sẽ diễn ra.
Vì vậy, đó là phần không đồng bộ đi vào chơi với việc sử dụng RxJS.
Và như tôi đã đề cập, lý do tại sao chúng tôi quan tâm đến RxJS là bởi vì
Angular tận dụng thư viện RxJS để
hỗ trợ cho lập trình phản ứng.
Angular chính nó có một số được xây dựng trong quan sát,
như chúng ta sẽ thấy trong một thời gian ngắn.
Khi bạn bước vào thế giới lập trình phản ứng, bạn sẽ thường nghe mọi người nói
về vật thể quan sát sau đó bạn sẽ nghe mọi người nói về các toán tử và
sau đó bạn cũng sẽ nghe mọi người nói về sơ đồ bằng đá cẩm thạch.
Bây giờ, sơ đồ bằng đá cẩm thạch là một cách để biểu diễn các
lập trình phản ứng bằng cách sử dụng các vật thể quan sát.
Vì vậy, nếu bạn tình cờ có một quan sát được,
sau đó nếu bạn xem điều này quan sát được như là một hàm của thời gian,
vì vậy nếu trục này đại diện cho một chức năng của thời gian, quan sát
sẽ được định kỳ phát ra các giá trị như thế này, cái khác.
Vì vậy, nếu bạn tổ chức các giá trị này dọc theo một chuỗi,
như là một hàm của thời gian, vì vậy bạn sẽ thấy các giá trị được phát ra như thế này.
Ngoài ra còn có khả năng bạn có thể gặp phải lỗi.
Trong trường hợp đó, bạn cần phải xử lý lỗi một cách thích hợp.
Nếu bạn xử lý lỗi một cách thích hợp,
bạn có thể tiếp tục hoặc bạn có thể dừng lại tại thời điểm đó.
Tương tự như vậy, khi một quan sát hoàn thành tất cả các lặp lại của
nó, sau đó nó sẽ được đánh dấu là hoàn thành của quan sát.
Vì vậy, bạn cần phải có thể thậm chí xử lý sự kiện hoàn thành trong một quan sát được.
Với thời gian này chú thích hành vi của quan sát được, sau đó bạn có thể lấy
các giá trị mà hình ảnh quan sát được và áp dụng các toán tử trên những quan sát được.
Bây giờ các giá trị này có thể được xem như là một mảng.
Nếu điều đó giúp bạn hiểu rõ hơn, bạn có thể xem nó như là một mảng các giá trị.
Bây giờ, các giá trị này sau đó có thể được vận hành bằng cách sử dụng các toán tử khác nhau.
Vì vậy, đó là nơi bản đồ của bạn, bộ lọc của bạn, giảm của bạn và một số toán tử mà
bất kỳ thư viện chương trình phản ứng điển hình như RxJS hỗ trợ.
Cho phép bạn chuyển đổi
một tập hợp các giá trị mà bạn nhận được từ một quan sát được thành một tập hợp các giá trị khác.
Qua đó, bạn kết thúc tạo ra một quan sát mới.
Và quan sát mới này sẽ bao gồm các
giá trị biến đổi từ quan sát ban đầu.
Vì vậy, đó là lý do tại sao tôi hiển thị các giá trị chuyển đổi như hình chữ nhật ở đây.
Chỉ để cung cấp cho bạn một ấn tượng trực quan về những gì nó là chúng tôi đang cố gắng để làm với
một nhà điều hành.
Vì vậy, bạn đang lấy một giá trị và sau đó biến nó thành một giá trị khác nhau.
Và chuỗi các giá trị khác nhau mà
Bạn có được bằng cách chuyển đổi các giá trị phát ra bởi một quan sát được.
Bản thân nó sẽ trở thành một chuỗi các giá trị, và do đó,
sẽ trở thành một quan sát khác.
Vì vậy, bạn có thể lấy được một quan sát từ một quan sát khác.
Nhưng quan sát thứ hai này phụ thuộc vào cái đầu tiên vì vậy nó phụ thuộc.
Hành vi của nó được gõ, cái đầu tiên thông qua việc sử dụng toán tử này.
Chúng ta sẽ thấy các ví dụ về những điều này khi chúng ta đi qua một số bài tập
trong bài học này và các bài học tiếp theo.
Còn Angular và RXJS, làm thế nào để họ đến với nhau?
Angular, như chúng tôi đã đề cập trước đó, hỗ trợ một số quan sát được một mình.
Và sự hỗ trợ này của các vật thể quan sát trong Angular cho phép bạn thực hiện một số
lập trình phản ứng trong ứng dụng Angular của bạn.
Vì vậy, ví dụ, các hình thức trong Angular,
chúng tôi đã thấy các hình thức phản ứng đã có trong một trong những bài học trước đó.
Tại thời điểm đó, tôi chưa bao giờ đề cập đến từ có thể quan sát một cách rõ ràng ở đó.
Nhưng bây giờ chúng ta biết có thể quan sát được, chúng ta sẽ quay trở lại dạng phản ứng, và
sau đó thực hiện một số biến đổi thành dạng phản ứng.
Các hình thức tự trở thành quan sát được trong Angular.
Và bất kỳ thay đổi nào trong các giá trị của bất kỳ yếu tố hình thức,
có thể được đầu ra, và quan sát bằng cách đăng ký để quan
sát được rằng khung Angular cung cấp cho chúng tôi.
Tương tự như vậy, HTTP, mà chúng ta sẽ gặp phải trong mô-đun tiếp theo của khóa học này,
cũng sẽ dựa trên quan sát được.
Vì vậy, khi dịch vụ của bạn đi và lấy dữ liệu từ một máy chủ, thư viện HTTP,
hoặc mô-đun HTTP trong Angular, hỗ trợ quan sát được.
Vì vậy, bất cứ khi nào bạn thực hiện bất kỳ phương pháp, nhận được, đặt, đăng, hoặc
xóa, sử dụng HTTP, họ sẽ mang lại cho bạn một quan sát
mà sau đó bạn có thể đăng ký trong dịch vụ của bạn.
Và sau đó biến đổi nó, và sau đó đưa nó cho các thành phần của bạn, và
các thành phần có thể đăng ký với các quan sát được.
Dịch vụ được cung cấp bằng cách chuyển đổi các luồng HTTP.
Và đó là nơi mà lập trình phản ứng và
dòng dữ liệu thông qua ứng dụng Angular của bạn trở nên rất đơn giản.
Tương tự, có một AsyncPipe, mà bạn sẽ gặp phải sau này trong khóa học này.
Và cũng có thể thay đổi phát hiện được xây dựng xung quanh quan sát được trong Angular.
Bạn sẽ thấy một số ví dụ về điều này trong phần còn lại của khóa học này.
Bây giờ, quay lại câu hỏi mà chúng ta đã thấy trong slide trước đó.
Làm thế nào để bạn có thể quan sát được và biến đổi nó thành một quan sát khác?
Dưới đây là một ví dụ mà bạn sẽ gặp phải trong bài tập sau bài giảng này.
Vì vậy, ở đây, chúng tôi có tham số tuyến đường
trong thành phần menu của chúng tôi, sử dụng tham số tuyến đường để
cung cấp giá trị của món ăn đã chọn cho thành phần chi tiết món ăn.
Vì vậy, tham số tuyến đường trở thành một quan sát được.
Mô-đun bộ định tuyến của Angular có một hoạt động ActivateDroute dịch vụ
hỗ trợ một loạt các quan sát được và một trong số đó là các tham số quan sát được.
Các tham số quan sát được gắn với các tham số tuyến đường.
Và do đó, bất kỳ thay đổi đối với
các tham số, trong URL mà bạn gặp phải sẽ được phát ra như là một quan sát được.
Bây giờ, vì vậy khi bạn nhận được các quan sát, vì vậy như bạn có thể thấy,
bạn có thể nhận được quyền truy cập vào điều này quan sát bằng cách nói các tham số tuyến đường này trong mã của bạn.
Vì vậy, các params chính nó là một quan sát được ở đây.
Bây giờ, để tham số này quan sát được,
bạn có thể áp dụng một toán tử như một toán tử ở đây gọi là switchmap.
Chúng ta sẽ thấy việc sử dụng điều này trong đoạn trích.
Toán tử switchmap lấy các tham số quan sát được.
Và sau đó biến đổi các tham số quan sát được thành một quan sát khác mà là một món ăn.
Nó lấy giá trị params, và sau đó trích xuất giá trị ID từ params,
cho phép bạn truy cập vào tham số route, id, hoặc
tham số mà bạn đã chỉ định, và sau đó sử dụng nó để đi và lấy các món ăn.
Vì vậy, mỗi khi tham số thay đổi, nó sẽ dẫn đến một lấy của một món ăn mới.
Và vì vậy mỗi khi tham số thay đổi,
đó là tương đương với phát ra một giá trị mới bởi các tham số của họ quan sát được.
Điều đó được chuyển thành lấy món ăn mới
mà đó là ID tương ứng.
Vì vậy, món ăn sau đó sẽ trở thành một quan sát khác.
Bây giờ, khi món ăn này có thể quan sát được, bạn có thể đăng ký
món ăn này quan sát được ở đây, và có được giá trị món ăn.
Và khi bạn có được giá trị món ăn, sau đó bạn có thể lấy giá trị món ăn, và sau đó nó
tạo ra biến món ăn của bạn trong thành phần chi tiết món ăn của bạn với giá trị món ăn đó.
Vì vậy, do đó, bất kỳ thay đổi nào đối với tham số tuyến đường truyền thông qua điều
hành switchmap này thành một
quan sát được, mà khi quan sát thông qua đăng ký,
sẽ cho phép bạn chuyển đổi nó và gán cho món ăn khác.
Và khi điều này xảy ra, quan điểm của bạn có thể được cập nhật với
món ăn mới đã được lấy từ dịch vụ.
Vì vậy, bây giờ, bạn thấy cách dữ liệu chảy qua tham số tuyến đường,
thông qua toán tử bản đồ chuyển mạch, và
dẫn đến sự thay đổi quan điểm của thành phần chi tiết món ăn của bạn.
Đó là lý do tại sao lập trình dựa trên quan sát hoặc lập
trình phản ứng trong Angular trở nên rất hữu ích cho
việc thực hiện các tính năng nhất định trong ứng dụng Angular của bạn.
Đây là một ví dụ như vậy.
Chúng ta sẽ thấy việc sử dụng ví dụ cụ thể này
trong bài tập sau bài giảng này.
Tôi nghĩ tôi sẽ làm cho
bạn dễ dàng nhớ tất cả những điều này bằng cách hát bài Ode to Observables.
Bạn nên hát bài này theo giai điệu của,
You Can Call Me Al bởi Paul Simon của Simon và Garfunkel nổi tiếng.
Nếu anh quay lại và nói, Paul Simon là ai?
Xin lỗi, thế hệ khác.
[ NHẠC]