Để xử lý nhiều Promise liên tục bất đồng bộ ta sử dụng Phương thức:
// Phép tính cộng
let add = (a, b) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (typeof a != 'number' || typeof b != 'number') {
return reject(
new Error('Tham số truyền vào phải là kiểu number! PHEP CONG')
);
}
return resolve(a + b);
}, 1000);
});
};
// Phép tính nhân
let multiply = (a, b) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (typeof a != 'number' || typeof b != 'number') {
return reject(
new Error('Tham số truyền vào phải là kiểu number! PHEP NHAN')
);
}
return resolve(a * b);
}, 1000);
});
};
// Phép tính chia
let divide = (a, b) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (typeof a != 'number' || typeof b != 'number') {
return reject(
new Error('Tham số truyền vào phải là kiểu number! PHEP CHIA')
);
}
if (b === 0) {
return reject(new Error('Số chia phải khác 0.'));
}
return resolve(a / b);
}, 1000);
});
};
Promise.all
và Promise.race
.Promise.all([aPromise01,aPromise02,aPromise03,…]) .then(result[output01,output02,output03,…]) .catch(…)`
var dienTich = Promise.all([add(4, 5), multiply(2, 3), divide(6, 2)]);
console.log(dienTich);
// Promise { <pending> }
var dienTich = Promise.all([add(4, 5), multiply(2, 3), divide(6, 2)])
.then((res) => console.log('Ket qua: ', res))
.catch((err) => console.log('Loi: ', err + ''));
// Ket qua: [ 9, 6, 3 ]
var dienTich = Promise.all([multiply(2, 3), divide(6, 2), add(4, 5)])
.then((res) => console.log('Ket qua: ', res))
.catch((err) => console.log('Loi: ', err + ''));
console.log('Lan 1: ', dienTich);
// Ket qua: [ 6, 3, 9 ]
var dienTich = Promise.all([add(4, '5'), multiply(2, 3), divide(6, 2)])
.then((res) => console.log('Ket qua: ', res))
.catch((err) => console.log('Loi: ', err + ''));
console.log('Lan 1: ', dienTich);
// Loi: Error: Tham số truyền vào phải là kiểu number! PHEP CONG
var dienTich = Promise.all([add(4, 5), multiply(2, 3), divide(6, '2')])
.then((res) => console.log('Ket qua: ', res))
.catch((err) => console.log('Loi: ', err + ''));
console.log('Lan 1: ', dienTich);
// Loi: Error: Tham số truyền vào phải là kiểu number! PHEP CHIA
var dienTich = Promise.all([add('4', 5), multiply(2, 3), divide(6, '2')])
.then((res) => console.log('Ket qua: ', res))
.catch((err) => console.log('Loi: ', err + ''));
console.log('Lan 1: ', dienTich);
// Loi: Error: Tham số truyền vào phải là kiểu number! PHEP CONG
Promise.race([aPromise01,aPromise02,aPromise03,…]) .then(…) .catch(…)`
var aResult = Promise.race([add(4, 5), multiply(2, 3), divide(6, 2)]);
console.log(aResult);
// Promise { <pending> }
var aResult = Promise.race([add('4', 5), multiply(2, 3), divide(6, '2')])
.then((res) => console.log(res))
.catch((err) => console.log(err + ''));
// Error: Tham số truyền vào phải là kiểu number! PHEP CONG
var aResult = Promise.race([add(4, 5), multiply(2, '3'), divide(6, 2)])
.then((res) => console.log('Ket qua: ', res))
.catch((err) => console.log(err + ''));
// Ket qua: 9
var aResult = Promise.race([add(4, 5), multiply(2, 3), divide(6, '2')])
.then((res) => console.log('Ket qua: ', res))
.catch((err) => console.log(err + ''));
// Ket qua: 9
var aResult = Promise.race([add(4, 5), multiply(2, 3), divide(6, 2)])
.then((res) => console.log('Ket qua: ', res))
.catch((err) => console.log(err + ''));
// Ket qua: 9
Promise.race
sẽ được truyền vào là mảng các Promise
Promise
và cần được handle
kết quả và bắt lỗi.Promise.race
chỉ quan tâm đến Promise
đầu tiên trong mảng, kết quả trả về của Promise
này sẽ được sử dụng cho Promise.race
, không cần quan tâm đến kết quả của các Promise
còn lại có Resolve
hay bị Reject
hay không.