23 September 2019

Async và Await là gì? Sử dụng await liên tiếp, Callback function. Async function trả về Promise

Async Await
Javascript là một ngôn ngữ bất đồng bộ.
Câu lệnh trước chưa chạy xong đã bắt đầu chạy câu lệnh thứ 2

Async và Await là gì?
demo.js
/**
 * Async Await
 */
let add = (a, b) => {
 return new Promise((resolve, reject) => {
  setTimeout(() => {
   if (typeof a == 'number' && typeof b == 'number') {
    resolve(a + b);
   } else {
    reject(new Error('Tham số phải là kiểu số!'));
   }
  }, 2000);
 })
}

let add = async () => {
 // let res = add(4, 5); // add chưa chạy xong đã chạy log
 let res = await add(4, 5); // add chạy xong thì mới chạy tới log
 console.log(res);
}

add();
command: node demo.js
Kết quả: '' Nếu không có await
Kết quả: 9 Nếu có await
// Lưu ý từ khóa await chỉ chạy trong function async.

Sử dụng await liên tiếp
demo.js
/**
 * Sử dụng await liên tiếp
 */
let add = (a, b) => {
 return new Promise((resolve, reject) => {
  setTimeout(() => {
   if (typeof a == 'number' && typeof b == 'number') {
    resolve(a + b);
   } else {
    reject(new Error('Tham số phải là kiểu số!'));
   }
  }, 2000);
 })
}
let multiply = (a, b) => {
 return new Promise((resolve, reject) => {
  setTimeout(() => {
   if (typeof a == 'number' && typeof b == 'number') {
    resolve(a * b);
   } else {
    reject(new Error('Tham số phải là kiểu số!'));
   }
  }, 2000);
 })
}
let divide = (a, b) => {
 return new Promise((resolve, reject) => {
  setTimeout(() => {
   if (b === 0) {
    reject(new Error('Chia cho số 0'));
   } else if (typeof a == 'number' && typeof b == 'number') {
    resolve(a / b);
   } else {
    reject(new Error('Tham số phải là kiểu số!'));
   }
  }, 2000);
 })
}

let tinhDienTich = async (a, b, h) => {
 try {
  let ab = await add(a, b);
  let abh = await multiply(ab, h);
  let square = await divide(abh, 2);
  console.log(square);
 } catch (error) {
  console.log(error.toString()); // phải bắt try catch với trường hợp này!
 }
}

tinhDienTich(3, 4, 5);
command: node demo.js
Kết quả: 17.5

Sử dụng callback function
demo.js
let tinhDienTich = async (a, b, h, callback) => {
 try {
  let ab = await add(a, b);
  let abh = await multiply(ab, h);
  let square = await divide(abh, 2);
  callback(undefined, square);
 } catch (error) {
  callback(error);
 }
}

tinhDienTich(3, 4, 5, (err, res) => {
 if (res) {
  console.log(res);
 } else {
  console.log(err.toString());
 }
});
command: node demo.js
Kết quả: 17.5

Sử dụng Async function trả về Promise
demo.js
let tinhDienTich = async (a, b, h) => {
 try {
  let ab = await add(a, b);
  let abh = await multiply(ab, h);
  let square = await divide(abh, 2);
  return Promise.resolve(square);
 } catch (error) {
  return Promise.reject(error);
 }
}

tinhDienTich(3, 4, 5)
.then(res => console.log(res))
.catch(err => console.log(err.toString()));
command: node demo.js
Kết quả: 17.5

0 nhận xét:

Post a Comment

 

BACK TO TOP

Xuống cuối trang