Tạo Promise đã hoàn thành trong JavaScript
Đôi khi bạn có thể cần tạo một promise đã
được thực hiện. Có hai phương thức cho việc này:
phương thức Promise.resolve
tạo ra một promise đã hoàn thành thành công, Promise.reject
tạo ra một promise bị từ chối. Tham số của các
phương thức này nhận vào thứ sẽ trở thành kết quả
hoặc lỗi của promise tương ứng.
Khi nào chúng ta có thể cần một promise đã hoàn thành? Hãy xem xét một ví dụ. Giả sử chúng ta có một hàm nào đó nhận tham số là một số, thực hiện một số thao tác không đồng bộ với nó và trả về một promise với kết quả:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
Chúng ta sẽ sử dụng hàm của mình theo cách sau:
func(5).then(function(res) {
console.log(res); // sẽ xuất ra 25
});
Bây giờ giả sử chúng ta quyết định rằng thao tác không đồng bộ của mình chỉ sẽ được thực hiện nếu số được truyền vào lớn hơn 0. Trong trường hợp ngược lại, kết quả của hàm phải là số không:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // kết quả bằng không
}
}
Tuy nhiên, bây giờ hàm trả về
hoặc một promise, hoặc một số. Vì điều này, chúng ta không
thể áp dụng phương thức then cho kết quả
của hàm nữa, vì trong trường hợp hàm trả về
một số, chúng ta sẽ gặp lỗi:
func(0).then(function(res) { // lỗi, áp dụng phương thức then cho số không
});
Phương thức Promise.resolve sẽ giúp chúng ta sửa vấn đề này:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // trả về một promise, không phải số
}
}
Bây giờ giả sử chúng ta quyết định rằng đối với số không được truyền vào
chúng ta sẽ trả về số không, còn đối với các số
nhỏ hơn 0 - một ngoại lệ. Phương thức Promise.reject sẽ giúp chúng ta:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else if (num === 0) {
return Promise.resolve(0);
} else {
return Promise.reject('incorrect number'); // trả về một promise bị từ chối
}
}