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

Related Posts:

  • NodeJS ExpressJS: Hello world example [EX-01] Javascript Frameworks ExpressJS, SailsJS, MeteorJS, KoaJS, FeathersJS https://expressjs.com/ https://expressjs.com/en/starter/hello-world.html npm init npm install express --save Hello world example … Read More
  • NodeJS ExpressJS: Post method [EX-04] Post method views/users/create.pug create.pug h1 Create user form(action="/users/create", method="POST") label Name input(name="name", type="text") button create views/users/index.pug index.pug h1… Read More
  • NodeJS Basic - URL Module URL Module Parsing url - query params node.js const http = require('http'); const url = require('url'); const server = http.createServer((req, res) => { const queryData = url.parse(req.url, true).query; co… Read More
  • NodeJS ExpressJS: Query parameters [EX-03] Query parameters  Query parameters app.js const express = require('express') const app = express() const port = 3000 app.set('view engine', 'pug') app.set('views', './views'); var users = [{ id: 'ID291', … Read More
  • NodeJS ExpressJS: Template engines [EX-02] Using template engines with Express Pug (jade), Mustache, EJS [1] Single page application (SPA)  - Nội dung render trên front end  - Không load lại trang  - Tương tác với data dạng Json API [2] Multiple pag… Read More

0 nhận xét:

Post a Comment

 

BACK TO TOP

Xuống cuối trang