Show Callback là một khái niệm không mới. Tuy nhiên, nó là một trong những khái niệm khá lằng ngoằng và dễ nhầm lẫn trong lập trình. Với 1 số bạn có basic về C++, Java hay C#, ta thường biết đến callback qua khái niệm delegate (con trỏ hàm). Bài viết đầu tiên, mình xin giới thiệu callback trong javascript. Lý do chọn javascript là vì Callback trong javascript là đơn giản, dễ hiểu nhất. Bài viết nhắm tới đối tượng là các bạn beginner nên mình sẽ cố gắng viết đơn giản nhất có thể. 1. Khái niệm về callback Đầu tiên, xin nhắc lại đôi chút về khá niệm callback: A callback is a piece of executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at some convenient time.Nói một cách dễ hiểu, callback tức là ta truyền một đoạn code (Hàm A) này vào một đoạn code khác (Hàm B). Tới một thời điểm nào đó, Hàm A sẽ được hàm B gọi lại (callback). Tới đây các bạn vẫn chưa hiểu? Ok, ngày xưa khi nghe các giáo viên dạy cái này mình cũng ko hiểu gì cả =))). Mình xin đưa ra 1 ví dụ đơn giản dễ hiểu ở phần dưới. 2. Ví dụ của callback. Ứng dụng trong jQuery Bạn có việc phải đi công tác xa nhà. Bạn dặn vợ, trong thời gian bạn đi, nếu như có ai giao quà tới, hãy đem qua tặng em gái dễ thương hàng xóm. Hàm A ở đây là việc tặng quà cho em hàng xóm: function tangQua(qua) { return console.log("Đã tặng " + qua); }Hàm B ở đây là việc vợ bạn ở nhà. Ta truyền hàm A vào như 1 argument cho hàm B, tại 1 thời điểm nào đó, hàm B sẽ gọi hàm A (Tức là vợ bạn mang quà qua cho em hàng xóm). function oNha(vo, tangQua) { var qua = "Quà đã nhận"; tangQua(qua); }Như các bạn thấy, hàm A được truyền vào như 1 argument. Các bạn biết jQuery có thể sử dụng rất nhiều callback mà ko biết. Hãy xét ví dụ dưới đây, ta hiển thị 1 pop-up khi click vào 1 button. Bài viết trước nói về fiddle nên lần này mình sẽ đưa link fiddle làm ví dụ: http://jsbin.com/potivubifi/1/watch?html,js,output Ở đây, function showPopup chính là hàm A, còn $(‘#btn’).click() là hàm B. Hàm B sẽ gọi hàm A khi ta click vào nút. Các bạn viết jQuery thường dùng cách ở dưới, nhưng không hiểu bản chất của việc mình đang làm. 3. Ứng dụng của callback Như mình đã nói, Javascript là một ngôn ngữ khá thích hợp để giới thiệu callback. Ta có thể truyền thẳng 1 function vào 1 function khác, vì trong javascript 1 function được xem như 1 đối tượng (object). Trong các ngôn ngữ khác như C#, ta phải dùng delegate để truyền 1 function vào function khác (Nhớ kĩ câu này, mình sẽ nói rõ hơn ở bài sau). Một số bạn sẽ hỏi: Callback mình code có xài mấy đâu? Thật ra trong quá trình code bạn có sử dụng callback mà không biết đấy (VD như code jQuery, hoặc gọi hàm khi user click vào 1 button trong WinForm, ASP.NET). Callback có khá nhiều ứng dụng như sau:
5 phút quảng cáo cho bộ phim (series bài viết) sắp tới. Hẹn gặp lại các bạn. Post navigationLập trình viên giỏi không phải chỉ biết codeBách khoa toàn thư mở Wikipedia Bước tới điều hướng Trong lập trình máy tính, callback là một đoạn code chạy được (thường là một hàm A) được sử dụng như tham số truyền vào của hàm B nào đó. Hàm A được gọi ngay lập tức hoặc trễ một chút sau khi hàm B được gọi. Các ngôn ngữ lập trình khác nhau hỗ trợ callback theo các cách khác nhau, thường được triển khai dưới dạng chương trình con, hàm nặc danh, chuỗi lệnh hoặc con trỏ hàm. Thiết kế[sửa | sửa mã nguồn]Có hai loại callback: đồng bộ (blocking callback) và không đồng bộ (asynchronous callback). Trong khi callback đồng bộ được gọi trước khi hàm trả về (trong ví dụ ngôn ngữ lập trình C bên dưới, hàm callback đồng bộ ở đây là hàm main), callback không đồng bộ có thể được gọi sau khi hàm trả về. Callback không đồng bộ thường được dùng trong các thao tác vào / ra hoặc trong việc xử lý sự kiện (event), và được gọi bằng lệnh ngắt hoặc từ các tiểu trình (thread). Callback đồng bộ thường không được sử dụng cho việc đồng bộ dữ liệu giữ liệu giữa các thread. Callback được dùng nhiều trong các chương trình có sử dụng giao diện cửa sổ. Trong trường hợp này, chương trình X cung cấp (1 tham chiếu tới) hàm callback Y của nó cho hệ điều hành và để cho hệ điều hành gọi hàm Y này, từ đó chương trình X có thể bắt và xử lý sự kiện click chuột hoặc ấn phím….(do hệ điều hành tạo ra) bằng hàm Y. Vấn đề được quan tâm ở đây là quyền hạn thực hiện và tính bảo mật. Vì hàm Y của chương trình X được gọi bởi hệ điều hành, Y không nên có cùng quyền hạn với các hàm khác của hệ thống. Cài đặt[sửa | sửa mã nguồn]Cách tạo và gọi callback rất khác nhau giữa các ngôn ngữ lập trình:
Ví dụ sử dụng[sửa | sửa mã nguồn]Javascript[sửa | sửa mã nguồn]function myFunction() { document.getElementById("demo").innerHTML = "Hello World"; } document.getElementById("myBtn").addEventListener("click", myFunction); // Hệ điều hành sẽ gọi hàm callback “myFunction” khi sự kiện click chuột trên element có ID là “myBtn” xảy ra C/C++[sửa | sửa mã nguồn] Ví dụ 3:[sửa | sửa mã nguồn]#include <stdio.h> #include <stdlib.h> void PrintTwoNumbers(int (*numberSource)(void)) { printf("%d and %dn", numberSource(), numberSource()); } /* Hàm callback */ int overNineThousand(void) { return (rand() % 1000) + 9001; } /* Hàm callback. */ int meaningOfLife(void) { return 42; } int main(void) { PrintTwoNumbers(&rand); // Kết quả có thể là “125185 and 8914334”. // Hàm rand() được dùng làm tham số, điều này tương đương với // “printf("%d and %dn", rand(), rand());” trong hàm PrintTwoNumbers PrintTwoNumbers(&overNineThousand); // Kết quả có thể là “9084 and 9441”. // Hàm overNineThousand được dùng làm tham số, điều này tương đương với // “printf("%d and %dn", overNineThousand (), overNineThousand ());” trong hàm PrintTwoNumbers PrintTwoNumbers(&meaningOfLife); // Kết quả là “42 and 42”. // Hàm meaningOfLife được dùng làm tham số, điều này tương đương với // “printf("%d and %dn", meaningOfLife (), meaningOfLife ());” trong hàm PrintTwoNumbers return ; } Ví dụ 4:[sửa |
sửa mã nguồn]/* * This is a simple C program to demonstrate the usage of callbacks * The callback function is in the same file as the calling code. * The callback function can later be put into external library like * e.g. a shared object to increase flexibility. * */ #include <stdio.h> #include <string.h> typedef struct _MyMsg { int appId; char msgbody[32]; } MyMsg; void myfunc(MyMsg *msg) { if (strlen(msg->msgbody) > ) printf("App Id = %d nMsg = %s n",msg->appId, msg->msgbody); else printf("App Id = %d nMsg = No Msgn",msg->appId); } /* * Prototype declaration */ void (*callback)(MyMsg *); int main(void) { MyMsg msg1; msg1.appId = 100; strcpy(msg1.msgbody, "This is a testn"); /* * Assign the address of the function "myfunc" to the function * pointer "callback" (may be also written as "callback = &myfunc;") */ callback = myfunc; /* * Call the function (may be also written as "(*callback)(&msg1);") */ callback(&msg1); return ; } /* Output is: App Id = 100 Msg = This is a test */ Xem thêm[sửa | sửa mã nguồn]
Tham khảo[sửa | sửa mã nguồn]
Thể loại:
Từ khóa: Callback, Callback, Callback LADIGI – Công ty dịch vụ SEO từ khóa giá rẻ, SEO từ khóa, SEO tổng thể cam kết lên Top Google uy tín chuyên nghiệp, an toàn, hiệu quả. Nguồn: Wikipedia Tôi là La Trọng Nhơn - người xây dựng nên LADIGI.VN, tôi có niềm đam mê với Digital Marketing. Tôi muốn xây dựng website này để chia sẻ đến những bạn gặp khó khăn khi bắt đầu vào nghề, có thể tiếp cận kiến thức đúng đắn và thực tế thông qua website này. |