Giới thiệu
Callback là kĩ thuật được ưa chuộng trong lập trình hiện nay nay. Ngặt nỗi, nếu áp dụng không khéo rất giản đơn xảy ra callback hell. Dưới con mắt nghệ thuật, nó lai lái kim trường đoản cú tháp, nhưng mà dưới nhỏ mắt coder, đặc biệt với các lập trình viên ưa-cái-đẹp thì nó chẳng khác gì một thảm họa. Bí quyết tránh callback hell không hẳn là ko có. Nếu chính đạo dùng Promise thì tịch tà chơi functional programming.
Bạn đang xem: Callback hell là gì
Dạo này mình được khai sáng sủa một chút tịch tà nên mình sẽ dùng nó để giải quyết và xử lý bài toán callback hell
Ví dụ
Để tìm tòi kĩ thuật này có lợi chỗ nào, mình đưa ra việc nho nhỏ và từng bước giải quyết vấn đề theo cả cách truyền thống lẫn biện pháp hiện dại.Giả sử ta có String như sau

Ta cần kéo ra mảng name nhằm hiển thị ra màn hình. Vấn đề này cũng tương tự việc bạn lấy dữ liệu từ server, parse tài liệu và hiển thị lên màn hình.
Tiền xử lý
Ta tạo ra các cách tiến hành và mã sản phẩm sử dụng chung cho cả 2 cách

CompletionHandle được mình dùng để thực hiện việc callback xuyên thấu bài viết. Đây là function cùng với tham số nguồn vào dạng enum Result (tương tự như Result trong Alamofire).
Ba phương thức được tạo ra lần lượt triển khai các thao tác:
convertUserDataFromString -> convert String thành DatagetUsers -> parse Data lịch sự mảng User modelgetAllName -> mang ra name tự mảng UserCách truyền thống
Ứng với tía phương thức nhắc trên, ta hotline lần lượt các function, chế tạo ra thành ba callback lồng nhau.

Cách làm cho này quá thân thuộc nên mình không giải thích gì thêm.
Functional programming
Với biện pháp này, ta buộc phải tư duy theo hướng hoàn toàn mới: đi trường đoản cú trừu tượng đến nỗ lực thể, chứ không phải từ rõ ràng đến trừu tượng (nghe giống công nghệ giáo dục đang áp dụng :D).
Đầu tiên ta khái niệm toán tử bắt đầu để phối kết hợp hai function thành một function duy nhất tiến hành cả nhị nhiệm vụ. Điều này sẽ không những làm cho code gọn gàng hơn, bên cạnh đó trông gian nguy hơn, nói theo cách khác functional style hơn.

Sức mạnh của "~>" diễn đạt rõ qua loại code sau:

Trong đó
convertUserDataFromString là function dạng (Result -> Void) -> Void. Hoàn toàn có thể đưa về ngôi trường hợp tổng thể (A) -> VoidgetUsers là function dạng (Data, Result -> Void) -> Void rất có thể đưa về ngôi trường hợp bao quát (A, B) -> VoidgetAllName là function dạng (Function getNames là tổng thích hợp của bố function trên, rất có thể biểu diễn dưới cách sau:

Từ trường hợp cụ thể trên, ta qui ra ngôi trường hợp tổng quát cho function "~>".
"First" đem lại trường hợp tổng thể là (A) -> Void, trách nhiệm của function này là nhận tài liệu input, gửi nó thành A rồi gửi vào vào callback (giống function convertUserDataFromString khái niệm ở trên)
"Second" đưa về trường hợp tổng thể là (A, B) -> Void, có trọng trách transform dữ liệu A dìm từ First thành B và chuyển vào trong callback (giống function getUser hoặc getAllName tư tưởng ở trên)
"~>" thì return (B) -> Void, đấy là callback chỉ dẫn output B sau thời điểm đã đi qua bước chuyển đổi A thành B.
Kết đúng theo ((A) -> Void) -> ((A, B) -> Void) thành ((B) -> Void) hoàn toàn có thể viết rút gọn gàng thành (A) -> (A,B) -> (B).Ta rất có thể hiểu theo kiểu: tài liệu (A) đi sang một bước biến hóa (A,B) thì bao gồm (B) để xài.
Xem thêm: Cách Tính Tích Phân Từng Phần Tính Nhanh Bằng Sơ Đồ, Tích Phân Từng Phần Tính Nhanh Bằng Sơ Đồ
Cái tuyệt của function "~>" là cổng đầu ra của nó rất có thể sử dụng làm nguồn vào của chính "~>" dưới dạng First param, ta chỉ việc ghép nó với 1 Second phù hợp lệ là có thể tạo thành một chuỗi những function lồng nhau.
Bước 1: (A) -> (A,B) -> (B)
Bước 2: (B) -> (B,C) -> (C)
Qui hấp thụ thành bước N: (N1) -> (N1,N2) -> N2
Dùng function ~> đỡ đần ta trải phẳng callback hell và đưa nó về dạng sát với ngôn ngữ tự nhiên:
Công việc D = quá trình A + các bước B + các bước C.
Chúng ta hoàn toàn có thể giải quyết bài xích toán theo phía khác cũng sử dụng functional programming. Bản thân sẽ trình diễn ở bài tiếp theo sau :). See ya!