Khi resolve được gọi, vật thể promise sẽ cập nhật kết quả trả về từ resolve, và hàm được dùng làm đối số đầu tiên của then sẽ được chạy
Lúc tạo vật thể promise thì đối số được dùng cho lớp Promise là một hàm được gọi là hàm thực thi:
Đối số của hàm thực thi, đế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àmThựcThi(hàmGiảiQuyết, hàmTừChối){
// ...
hàmGiảiQuyết(giáTrịTrongHàmGiảiQuyết)
// ...
hàmTừChối(giáTrịTrongHàmTừChối)
}
const promise = new Promise(hàmThựcThi);
Đáng lẽ là bạn phải định nghĩa hàm giải quyết và hàm từ chối. Nhưng khi chúng được dùng làm biến cho hàm được dùng làm biến cho lớp Promise
(tức là hàm thực thi), thì JS sẽ tự động định nghĩa sẵn hai hàm này luôn, bạn không cần định nghĩa gì cả. Và thường người viết hay đặt tên cho hàm giải quyết là resolve
và hàm từ chối là reject
. Cho nên bạn sẽ hay thấy code người ta viết tắt lại như này:
const promise = new Promise((resolve, reject) => {
// ...
resolve(giáTrịTrongHàmGiảiQuyết)
// ...
reject(giáTrịTrongHàmTừChối)
});
Nhớ rằng, Vật thể promise có 2 thuộc tính là state và result, và 3 phương thức là then, catch, và finally. Khi resolve()
được gọi:
- Thuộc tính
state
đang từpending
sẽ được gán giá trị mới làfulfilled
- Giá trị được truyền vào trong
resolve()
sẽ được gán vào thuộc tínhresult
- Hàm được dùng làm đối số đầu tiên của
then()
sẽ chạy
Ngược lại, khi reject()
được gọi:
- Thuộc tính
state
đang từpending
sẽ được gán giá trị mới làrejected
- Giá trị được truyền vào trong
reject()
sẽ được gán vào thuộc tínhresult
- Hàm được dùng làm đối số thứ hai của
then()
sẽ chạy
Nguồn:: Tự ngẫm nghĩ, trải nghiệm