Đối số của Promise là một hàm. Nó được gọi là hàm thực thi (executor)
function hàmThựcThi(biến1, biến2){
// Những hàm bất đồng bộ thì để vào đây
}
const promise = new Promise(hàmThựcThi);
Đối số của hàmThựcThi
, đến lượt nó, cũng là 2 hàm khác nhau, được gọi lần lượt là hàm giải quyết và hàm từ chối:
function hàmGiảiQuyết(giáTrịTrongHàmGiảiQuyết){}
function hàmTừChối(giáTrịTrongHàmTừChối){}
function hàmThựcThi(hàmGiảiQuyết, hàmTừChối){}
Thông thường, bạn phải định nghĩa hàmGiảiQuyết
và hàmTừChối
. Nhưng nếu bạn
Nếu chạy thông thường thì bạn chỉ cần return
lấy kết quả trong hàmThựcThi
là được. Nhưng nhớ rằng ở đây ta đang truyền nó vào Promise
. Mà đây là một lớp được JS viết ra sẵn, không phải là do bạn viết ra. Khi JS viết ra, nó không viết dòng nào để nhận kết quả của hàmThựcThi
. Tức là việc bạn có return
trong đó không có tác dụng gì (ngoài trừ việc làm nó kết thúc sớm).
Thứ JS thiết kế ở Promise
, là khi chạy hàmThựcThi
thì hàmGiảiQuyết
được gọi trước hay là hàmTừChối
được gọi trước. Nếu hàmGiảiQuyết
được gọi trước, thì giáTrịTrongHàmGiảiQuyết
sẽ được gán vào thuộc tính result
của vật thể promise
, đồng thời chuyển giá trị của thuộc tính state
của nó từ pending
sang fulfilled
. Ngược lại, nếu hàmTừChối
được gọi trước, thì giáTrịTrongHàmTừChối
sẽ được gán vào thuộc tính result
của vật thể promise
, đồng thời chuyển giá trị của thuộc tính state
của nó từ pending
sang rejected
.
resolve, reject là hai hàm được JS cung cấp sẵn. Chúng được dùng làm đối số cho hàm thực thi
Để lấy được giá trị state và result của promise, cần dùng các phương thức then và catch của nó
Tham khảo: