Ta xét ví dụ: In ra màn hình dãy số tăng dần sau mỗi giây(Không sử dụng chức năng setInterval)
function logCount(ms) {
setTimeout(function () {
console.log(1);
setTimeout(function () {
console.log(2);
setTimeout(function () {
console.log(3);
setTimeout(function () {
console.log(4);
setTimeout(function () {
console.log(5);
setTimeout(function () {
console.log(6);
setTimeout(function () {
console.log(7);
setTimeout(function () {
console.log(8);
}, ms);
}, ms);
}, ms);
}, ms);
}, ms);
}, ms);
}, ms);
}, ms);
}
logCount(1000);
var pr = new Promise( // Object Constructor
//Executor: Thực hiện xử lý nào đó.
function (resolve, reject) {
//Logic
// - Thành công: resolve()
// - Thất bại: reject()
}
);
//prettier-ignore
pr
.then()
.catch()
.finally();
var pr = new Promise(function (resolve, reject) {
console.log("Begin!");
var inputValue = 3; // Đúng là kiểu Number
if (typeof inputValue !== "number") {
console.log("Thất bại");
reject("Lỗi");
} else {
console.log("Thành công");
resolve(inputValue ** 2);
}
});
//prettier-ignore
pr
.then(rs=>console.log("Result: ",rs))
.catch(err=>console.log("Error2: ",err))
.finally(dt=>console.log("Done: ",dt));
// Thành công
// Result: 9
// Done: undefined
output
) sẽ làm giá trị đầu ra ở .then(rs
)dt
) không xác định giá trị: dt
là undefined
var pr = new Promise(function (resolve, reject) {
var inputValue = "3";
if (typeof inputValue !== "number") {
console.log("Thất bại");
reject("Lỗi");
} else {
console.log("Thành công");
resolve(inputValue ** 2);
}
});
//prettier-ignore
pr
.then(rs=>console.log("Result: ",rs))
.catch(err=>console.log("Error2: ",err))
.finally(dt=>console.log("Done: ",dt))
// Thất bại
// Error2: Lỗi
// Done: undefined
Khi xử lý logic chạy vào Reject:
error
) sẽ làm giá trị đầu ra ở err
của .catch(err
)dt
) không xác định giá trị: dt
là undefined
Ta thay đổi 1 tý ở xử lý .then như sau:
var pr = new Promise(function (resolve, reject) {
var inputValue = "3";
if (typeof inputValue !== "number") {
console.log("Thất bại");
reject("Lỗi");
} else {
console.log("Thành công");
resolve(inputValue ** 2);
}
});
//prettier-ignore
pr
.then(
result=>console.log("Result: ",result) //result
, err=>console.log("Error1: ",err) //error
)
.catch(err=>console.log("Error2: ",err))
.finally(dt=>console.log("Done: ",dt))
// Thất bại
// Error1: Lỗi
// Done: undefined
error
) sẽ làm giá trị đầu ra ở err
của .then(err
)dt
) không xác định giá trị: dt
là `undefinedPromise
được dùng như khởi tạo 1 đối tượng nguyên mẫu - Object Constructor
bằng từ khóa New
Resolve()
Reject()
Khi sử dụng đối tượng Promise sẽ có 3 phương thức xử lý handle(bắt lỗi):
output
từ xử lý Resolve(output
) sẽ là đối số đầu ra ở .then(result
)output
từ xử lý Reject(output
) sẽ là đối số đầu ra ở .catch(error
)output
) và có xử lý tại .then(result,error
) thì xử lý sẽ ưu tiên xử lý ở .then mà không xử lý tại bắt lỗi .catch() mà chỉ xử lý ở .then(result,error
)var pr = new Promise( // Object Constructor
//Executor: Thực hiện xử lý nào đó.
function (resolve, reject) {
//Logic
// - Thành công: resolve()
// - Thất bại: reject()
reject(dtError);
}
);
//prettier-ignore
pr
.then(
result => result,
dtError => Executor(dtError) // Kết quả dtError từ reject(dtError);
)
.catch()
.finally();
var promise = new Promise(function (resolve, reject) {
reject("Từ chối!");
});
promise
.then(
(rs) => rs,
(error) => console.log("Error: ", error)
)
.catch((error) => console.log("Catch: ", error));
// Error: Từ chối!