Giới thiệu
Một trong những khái niệm quan trọng nhất của lập trình JavaScript là
Promise
. Người ta thường dùng nó khi làm việc với các tác vụ cần có sự chờ đợi, chẳng hạn như gửi một request về máy chủ và phải chờ câu trả lời, hay một hàm tính toán mất rất nhiều thời gian. Khái niệm này tuy được sử dụng rộng rãi, nhất là trong lập trình Web, nhưng lại thường gây hiểu lầm và rất dễ sinh ra bug nếu bạn không nắm vững các chi tiết kỹ thuật. Trong bài viết này, chúng ta sẽ tìm hiểu kỹ hơn về Promise nói riêng và lập trình asynchronous nói chung nhé.Promise
là gì?
Promise
trong tiếng Anh là lời hứa, giống như kiểu bạn đòi ai đó trả tiền cho bạn, nhưng người đó chưa có tiền, nên chỉ cho bạn một lời hứa là họ sẽ trả bạn. Họ trả bao nhiêu thì phải đến lúc đó mới biết được. Lập trình cũng giống vậy, bạn yêu cầu máy chủ cung cấp thông tin gì đó cho bạn, nhưng cũng phải mất chút thời gian. Trong lúc này, máy tính của bạn có thể chuyển sang làm những công chuyện khác, cho tới khi nhận được câu trả lời thì mới quay sang xử lý nó khi rảnh. Và cũng giống như ngoài đời thực, khi người ta đã mang tiền tới nhà bạn, bạn cũng phải làm nốt công chuyện bạn đang làm dở, rồi mới sắp xếp chạy ra mở cửa cho người ta được.Quá trình này còn được gọi là lập trình không đồng bộ (asynchronous programming). JavaScript khi chạy trên trình duyệt chỉ có duy nhất một thread (giống như bạn chỉ có một cơ thể), nên nó phải liên tục chuyển giữa các tác vụ. Một tác vụ đồng bộ (synchronous process) sẽ được thực thi liên tục từ đầu đến đích mà không ngừng nghỉ, nhưng một tác vụ không đồng bộ (asynchronous process) thì có thể sẽ được "tạm ngưng" ở một thời điểm nào đó (thời điểm này có quy tắc chứ cũng không phải tùy tiện muốn ngưng lúc nào cũng được), rồi trở lại tiếp tục sau. Thường thì một hàm không đồng bộ có thể được tạm ngưng khi nó đang chờ một hàm không đồng bộ khác.