khoa-pham-async-await

Phương thức all và race


Để 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);
  });
};

1. Promise.all

1.1 Syntax - Cú pháp sử dụng

1.2 Sử dụng xử lý nhiều Promise

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

1.3 Tóm tắt

2. Promise.race

2.1 Syntax - Cú pháp sử dụng

1.2 Sử dụng xử lý nhiều Promise

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

2.3 Kết luận