khoa-pham-async-await

Lý thuyết và cách hoạt động của Promise



1. Ví dụ:

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);

2. Cấu trúc lệnh

var pr = new Promise( // Object Constructor
  //Executor: Thực hiện xử lý nào đó.
  function (resolve, reject) {
    //Logic
    // - Thành công: resolve()
    // - Thất bại: reject()
  }
);

//prettier-ignore
pr
  .then()
  .catch()
  .finally();

3. Các trạng thái trả về của Promise

3.1 Xử lý Logic vào Resolve()

var pr = new Promise(function (resolve, reject) {
  console.log("Begin!");
  var inputValue = 3; // Đúng là kiểu Number
  if (typeof inputValue !== "number") {
    console.log("Thất bại");
    reject("Lỗi");
  } else {
    console.log("Thành công");
    resolve(inputValue ** 2);
  }
});

//prettier-ignore
pr
.then(rs=>console.log("Result: ",rs))
.catch(err=>console.log("Error2: ",err))
.finally(dt=>console.log("Done: ",dt));

// Thành công
// Result:  9
// Done:  undefined

3.2 Xử lý Logic vào Reject()

var pr = new Promise(function (resolve, reject) {
  var inputValue = "3";
  if (typeof inputValue !== "number") {
    console.log("Thất bại");
    reject("Lỗi");
  } else {
    console.log("Thành công");
    resolve(inputValue ** 2);
  }
});

//prettier-ignore
pr
.then(rs=>console.log("Result: ",rs))
.catch(err=>console.log("Error2: ",err))
.finally(dt=>console.log("Done: ",dt))

// Thất bại
// Error2:  Lỗi
// Done:  undefined
var pr = new Promise(function (resolve, reject) {
  var inputValue = "3";
  if (typeof inputValue !== "number") {
    console.log("Thất bại");
    reject("Lỗi");
  } else {
    console.log("Thành công");
    resolve(inputValue ** 2);
  }
});

//prettier-ignore
pr
.then(
      result=>console.log("Result: ",result) //result
    , err=>console.log("Error1: ",err) //error
  )
.catch(err=>console.log("Error2: ",err))
.finally(dt=>console.log("Done: ",dt))

// Thất bại
// Error1:  Lỗi
// Done:  undefined

3.3 Tóm tắt

var pr = new Promise( // Object Constructor
  //Executor: Thực hiện xử lý nào đó.
  function (resolve, reject) {
    //Logic
    // - Thành công: resolve()
    // - Thất bại: reject()
    reject(dtError);
  }
);

//prettier-ignore
pr
.then(
  result => result,
  dtError => Executor(dtError) // Kết quả dtError từ reject(dtError);
)
.catch()
.finally();
var promise = new Promise(function (resolve, reject) {
  reject("Từ chối!");
});

promise
  .then(
    (rs) => rs,
    (error) => console.log("Error: ", error)
  )
  .catch((error) => console.log("Catch: ", error));

// Error:  Từ chối!