khoa-pham-async-await

Promise status và Promise value


1. Mô tả

2. Chuẩn bị

Cấu trúc

Chuẩn bị

// File server.js
let express = require('express');
let app = express();
app.listen(3000);
app.set('view engine', 'ejs');
app.set('views', './views');

app.get('/', (req, res) => {
  res.render('home');
});
<!-- home.ejs -->

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Lập trình Nodejs: Xử lý bất đồng bộ trong Javascript</title>
    <style>
      body {
        height: 100vh;
        background: linear-gradient(to top left, #28b487, #7dd56f);
      }
      h1 {
        text-align: center;
        color: white;
      }
    </style>
    <script type="text/javascript">
      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!')
              );
            }
            resolve(a + b);
          }, 2000);
        });
      };
    </script>
    <!-- <script src="./script.js"></script> -->
  </head>
  <body>
    <h1>Lập trình Nodejs: Xử lý bất đồng bộ trong Javascript</h1>
    <h2>Promise status và Promise value</h2>
  </body>
</html>
<script type="text/javascript">
  ...
</script>

để tìm hiểu về cách hoạt động promise trên client.

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!'));
      }
      resolve(a + b);
    }, 1000);
  });
};

add(4, 5).then(
  (res) => console.log(res),
  (err) => console.log(err + '')
);

Terminal run server.js

Trình duyệt

3. Tìm hiểu cách hoạt động

promises

Trình duyệt

3.1 Thao tác 1:

let a = add(4, 5);
console.log(a);

Promise pending Promise pending

Chrome Edge Fire Fox

3.2 Thao tác 2:

// Log lần 1
let a = add(4, '5');
console.log(a);
// Log lần 2 sau 2500ms
setTimeout(() => {
  console.log(a);
}, 2500);

Xử lý 2.1 Xử lý 2.2

3.3 Thao tác 3:

// Log lần 1
let a = add(4, 5).then(
  (result) => console.log(result),
  (err) => console.log(err + '')
);
console.log(a);
// Log lần 2 sau 2500ms
setTimeout(() => {
  console.log(a);
}, 2500);

Xử lý 3.1

// Log lần 1
let a = add(4, 5).then(
  (result) => 'Kết quả: ' + result,
  (err) => console.log(err + '')
);
console.log(a);
// Log lần 2 sau 2500ms
setTimeout(() => {
  console.log(a);
}, 2500);

Xử lý 3.2

// Log lần 1
let a = add(4, '5').then(
  (result) => 'Kết quả: ' + result,
  (err) => 'Lỗi: ' + err + ''
);
console.log(a);
// Log lần 2 sau 2500ms
setTimeout(() => {
  console.log(a);
}, 2500);

Xử lý 3.3

// Log lần 1
let a = add(4, '5');
console.log(a);
// Log lần 2 sau 2500ms
setTimeout(() => {
  console.log(a);
}, 2500);

Xử lý 3.4

Xử lý 3.3

3.4 Thao tác 4:

// Log lần 1
let a = add(4, '5')
  .then(
    (result) => 'Kết quả: ' + result,
    (err) => 'Lỗi: ' + err + ''
  )
  .then(() => console.log('Thành công rồi!'));

console.log(a);

// Log lần 2 sau 2500ms
setTimeout(() => {
  console.log(a);
}, 2500);

Xử lý 4.1

// Log lần 1
// Log lần 1
let a = add(4, 5)
  .then(
    (result) => {
      console.log('.then thứ nhất: ' + result);
      return 'Kết quả: ' + result;
    },
    (err) => 'Lỗi: ' + err + ''
  )
  .then((b) => console.log('Thành công rồi!' + b));

console.log(a);

// Log lần 2 sau 2500ms
setTimeout(() => {
  console.log(a);
}, 2500);

Xử lý 4.2

// Log lần 1
let a = add(4, '5')
  .then(
    (result) => {
      console.log('.then thứ nhất: ' + result);
      return 'Kết quả: ' + result;
    },
    (err) => {
      console.log(err + '');
      return 'Bị lỗi.';
    }
  )
  .then((b) => console.log('Thành công rồi!' + b));

console.log(a);

// Log lần 2 sau 2500ms
setTimeout(() => {
  console.log(a);
}, 2500);

Xử lý 4.3

// Log lần 1
let a = add(4, '5')
  .then(
    (result) => {
      console.log('.then thứ nhất: ' + result);
      return 'Kết quả: ' + result;
    },
    (err) => {
      console.log(err + '');
      return 'Bị lỗi.';
    }
  )
  .then((b) => 'Then thứ 2 - ' + b);

console.log(a);

// Log lần 2 sau 2500ms
setTimeout(() => {
  console.log(a);
}, 2500);

Xử lý 4.4

4. Tóm tắt