khoa-pham-async-await

Promise



1. Synchronous - Asynchronous

1.1 Synchronous - Đồng Bộ

console.log("Line 1");
console.log("Line 2");

//Console
// Line 1
// Line 2
  - **Bước 1: Chuẩn bị nguyên liệu**
    - 500 g cá quả (hoặc cá chép, trắm, rô, basa, bông lau, lòng tong, thu,...).
    - 2 củ hành khô
    - 3 tép tỏi
    - 1 mẩu gừng
    - 3 quả ớt hiểm
    - 1,5 thìa canh nước mắm
    - 1 thìa canh đường
    - Dầu ăn
    - Tiêu
  - **Bước 2: Sơ chế nguyên liệu**
    - 1. Chà xát da cá và bụng cá với giấm và muối cho sạch nhớt. Cạo sạch máu đọng và màng đen trong bụng cá. Rửa lại bằng nước lạnh, để ráo.
    - 2. Hành tỏi băm nhỏ. Gừng thái sợi. Ớt đập dập.
  - **Bước 3: Ướp cá**
    - 1. Ướp cá với 1,5 thìa canh mắm, 1 thìa canh đường, ớt.
    - 2. Làm nóng nồi/chảo với 2 thìa canh dầu ăn. Thắng nước hàng (nước màu) với 1 thìa canh đường. Khi đường vừa chuyển màu mật ong, tắt bếp.
    - 3. Cho hành, tỏi, gừng vào phi thơm.
    - 4. Đợi hỗn hợp hành tỏi nguội, trút hết vào ướp cá.
    - 5. Ướp cá 30-60 phút trong tủ lạnh.
  - **Bước 4: Kho cá**
    - 1. Xếp cá vào nồi/chảo, đậy vung.
    - 2. Bật lửa lớn cho nồi sôi lên khoảng 5 phút rồi hạ xuống lửa nhỏ nhất. Nếu thấy nước không đủ ngập sâm sấp khúc cá thì châm nước sôi.
    - 3. Kho cá đậy vung, lửa nhỏ khoảng 1 tiếng tới khi nước kho sệt lại. Sau khi kho được 30-40 phút, bạn nhẹ nhàng lật cá để 2 mặt đều ngấm gia vị.
  - **Bước 5: Hoàn thành**
    - Rắc nhiều tiêu trước khi ăn. Cá kho ăn nóng hoặc nguội với cơm nóng, rau luộc.

- Vấn đề nảy sinh

Nếu cần thực hiện một lúc nhiều công việc cùng lúc, và nếu một công việc nào đó chưa thực hiện xong thì vẫn cho công việc kế tiếp thực hiện thì là thế nào???

Vậy lúc này cần xử lý Bất đồng bộ (Asynchronous)

1.2 Asynchronous - Bất Đồng Bộ

setTimeout(() => {
  console.log("Line 1");
}, 1000);
console.log("Line 2");

//Console
// Line 2
// Line 1

1.3 Sự cần thiết xử lý Đồng bộ trong Bất đồng bộ

Asynchronous(Món 1) // Dish01
  Synchronous(Bước 1) // Task01
  Synchronous(Bước 2) // Task02
  Synchronous(Bước 3) // Task03

Asynchronous(Món 2) // Dish02
  Synchronous(Bước 1) // Task01
  Synchronous(Bước 2) // Task02
  Synchronous(Bước 3) // Task03
  Synchronous(Bước 4) // Task04

Asynchronous(Món 3) // Dish03
  Synchronous(Bước 1) // Task01
  Synchronous(Bước 2) // Task02
Asynchronous(Dish01){ // Chế biến món 1
 Process(Task01)      // Thực hiện bước 1
 if(Task01 Done){     // Nếu bước 1 hoàn thành
  Process(Task02)     // Thực hiện bước 2
  if(Task02 Done){    // Nếu bước 2 hoàn thành
    Process(Task03)   // Thực hiện bước 3
    if(Task03 Done){
      Process(Task04)
      if(Task04 Done){
        Process(Task05)
        if(Task05 Done){
          Process(Task06)
          if(Task06 Done){
            if(Task06 Done){
              ...
            }

          }
        }
      }
    }
  }
 }
}

Ta xét ví dụ: In ra màn hình dãy số tăng dần sau mỗi giây(Không sử dụng chức năng setInterval)

function logCount(ms) {
  setTimeout(function () {
    console.log(1);
    setTimeout(function () {
      console.log(2);
      setTimeout(function () {
        console.log(3);
        setTimeout(function () {
          console.log(4);
          setTimeout(function () {
            console.log(5);
            setTimeout(function () {
              console.log(6);
              setTimeout(function () {
                console.log(7);
                setTimeout(function () {
                  console.log(8);
                }, ms);
              }, ms);
            }, ms);
          }, ms);
        }, ms);
      }, ms);
    }, ms);
  }, ms);
}

logCount(1000);

1.4 Vấn đề của xử lý quá nhiều Đồng bộ trong Bất đồng bộ (Nỗi đau của Asynchronous)

Giải pháp xử lý nào cho vấn đề này? -> Và Promise được sinh ra để giải quyết nỗi đau này. Promise làm giảm độ phức tạp Callback Hell trong viết lệnh code lồng nhau nhiều lần.