khoa-pham-async-await

Promise Chain



1. Nhắc lại Callback Hell

2. Tính chất chuỗi của Promise

var newPromise = new Promise((resolve, reject) => {
  resolve('Resolve');
});

newPromise
  .then((result) => console.log('Successfully: ', result))
  .catch((error) => console.error(error + ''));

2.1 Tạo các khối .then liên tiếp

var newPromise = new Promise((resolve, reject) => {
  resolve('Success!');
});

newPromise
  .then(() => console.log(1)) // Line 1
  .then(() => console.log(2)) // Line 2
  .then(() => console.log(3)) // Line 3
  .catch((error) => console.error(error + ''))
  .finally(() => console.log('Done!'));

Promise Chain

2.2 Tạo các khối .then liên tiếp có xử lý setTimeOut

var newPromise = new Promise((resolve, reject) => {
  resolve('Success!');
});

newPromise
  .then(() => console.log(1)) // Line 1
  .then(() => {
    setTimeout(() => {
      console.log(2); // Line 2
    }, 1000);
  })
  .then(() => console.log(3)) // Line 3
  .catch(() => console.error('Error!'))
  .finally(() => console.log('Done!'));

Promise Chain

2.3 Tạo các khối .then liên tiếp, có xử lý return giá trị

var newPromise = new Promise((resolve, reject) => {
  resolve();
});

//prettier-ignore
newPromise
  .then(function () {
    console.log('Line1'); // Line 1
  }) 
  .then(function (data) {
    console.log('Line2 : ', data); // Line 2
    return 2
  })
  .then(function (data) {
    console.log('Line3 : ', data); // Line 3
  })
  .catch(() => console.error('Error!'))
  .finally(() => console.log('Done!'));

Promise Chain

var newPromise = new Promise((resolve, reject) => {
  resolve('Success!');
});

newPromise
  .then((rs) => {
    console.log(rs); // line Success
    return 1;
  })
  .then((line2) => {
    console.log(line2); // line 1
    return 2;
  })
  .then((line3) => {
    console.log(line3); // line 2
    return 3;
  })
  .then((line4) => {
    console.log(line4); // line 3
  })
  .catch(() => console.error('Error!'))
  .finally(() => console.log('Done!'));

Promise Chain

2.4 Tạo các khối .then liên tiếp return giá trị, có setTimeOut

var newPromise = new Promise((resolve, reject) => {
  resolve('Success!');
});

newPromise
  .then((rs) => {
    setTimeout(() => {
      console.log('Line 1: ', rs); // line 1
      return 1;
    }, 4000);
  })
  .then((line2) => {
    setTimeout(() => {
      console.log('Line 2: ', line2); // line 2
      return 2;
    }, 3000);
  })
  .then((line3) => {
    setTimeout(() => {
      console.log('Line 3: ', line3); // line 3
      return 3;
    }, 2000);
  })
  .then((line4) => {
    setTimeout(() => {
      console.log('Line 4: ', line4); // line 4
    }, 1000);
  })
  .catch(() => console.error('Error!'))
  .finally(() => console.log('Done!'));

Promise Chain

var newPromise = new Promise((resolve, reject) => {
  resolve('Success!');
});

newPromise
  .then((rs) => {
    setTimeout(() => {
      return 1;
    }, 4000);
  })
  .then((data) => {
    setTimeout(() => {
      console.log('Line 2: ', data); // line 2
      return 2;
    }, 3000);
  })
  .then((data) => {
    setTimeout(() => {
      console.log('Line 3: ', data); // line 3
      return 3;
    }, 2000);
  })
  .then((data) => {
    setTimeout(() => {
      console.log('Line 4: ', data); // line 4
    }, 1000);
  })
  .catch(() => console.error('Error!'))
  .finally(() => console.log('Done!'));

Promise Chain

2.5 Tạo khối liên tiếp và có xử lý setTimeOut -> Promise

var newPromise = new Promise((resolve, reject) => {
  resolve('Success!');
});

newPromise
  .then((data) => {
    setTimeout(() => {
      return new Promise((resolve) => {
        console.log('Line 1: ', data); // Line 1
        resolve(2);
      });
    }, 2000);
  })
  .then((data) => {
    setTimeout(() => {
      return new Promise((resolve) => {
        console.log('Line 2: ', data); // Line 2
        resolve(3);
      });
    }, 1000);
  })
  .then((data) => {
    console.log('Line 3: ', data); // Line 3
  })
  .catch(() => console.error('Error!'))
  .finally(() => console.log('Done!'));

Promise Chain

2.6 Tạo khối liên tiếp và có xử lý Promise -> setTimeout

var newPromise = new Promise((resolve, reject) => {
  resolve('Success!');
});

newPromise
  .then((data) => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log('Line 1: ', data); // Line 1
        resolve(1);
      }, 3000);
    });
  })
  .then((data) => {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log('Line 2: ', data); // Line 2
        resolve(2);
      }, 2000);
    });
  })
  .then((data) => {
    console.log('Line 3: ', data); // Line 3
  })
  .catch(() => console.error('Error!'))
  .finally(() => console.log('Done!'));

Promise Chain

var newPromise = new Promise((resolve, reject) => {
  resolve();
});

//prettier-ignore
newPromise
  .then(function () {
    return new Promise((resolve) => {
      console.log('Line1'); // Line 1
      setTimeout(resolve,3000)
    })
  })
  .then(function (data) {
    console.log('Line2'); // Line 2
    return 2
  })
  .then(function (data) {
    console.log('Line3 : ', data); // Line 3
  })
  .catch(() => console.error('Error!'))
  .finally(() => console.log('Done!'));

Promise Chain

2.7 Tạo khối liên tiếp và có xử lý Promise có Reject

var newPromise = new Promise((resolve, reject) => {
  resolve();
});

//prettier-ignore
newPromise
  .then(function () {
    return new Promise((resolve) => {
      console.log('Line1'); // Line 1
      setTimeout(() => {
        resolve(2);
      },3000)
    })
  })
  .then(function (data) {
    return new Promise((resolve, reject) => {
      console.log('Line2: ', data); // Line 2
      setTimeout(() => {
        reject("Error1") // Rejected 1
      },2000)
    })
  })
  .then(function (data) {
    return new Promise((resolve) => {
      console.log('Line3: ', data); // Line3
      setTimeout(() => {
        resolve(3) // Resolve
      },2000)
    })
  })
  .catch((error) => console.error('Error 1: ', error))
  .then(function (data) {
    return new Promise((resolve, reject) => {
       setTimeout(() => {
        console.log('Line4: ', data); // Line 4
        reject("Error1") // Rejected 2
      },2000)
    })
  })
  .catch((error) => console.error('Error: ',error)) // Rejected Catch
  .finally(() => console.log('Done!'));

Promise Chain

var newPromise = new Promise((resolve, reject) => {
  resolve();
});

//prettier-ignore
newPromise
  .then(function () {
    return new Promise((resolve) => {
      console.log('Line1'); // Line 1
      setTimeout(() => {
        resolve(2);
      },3000)
    })
  })
  .then(function (data) {
    return new Promise((resolve, reject) => {
      console.log('Line2: ', data); // Line 2
      setTimeout(() => {
        reject("Error1") // Rejected 1
      },2000)
    })
  })
  .then(function (data) {
    return new Promise((resolve) => {
      console.log('Line3: ', data); // Line 3
      setTimeout(() => {
        resolve(3)
      },2000)
    })
  })
  .then(function (data) {
    return new Promise((resolve, reject) => {
       setTimeout(() => {
        console.log('Line4: ', data); // Line 4
        reject("Error1")
      },2000)
    })
  })
  .catch((error) => console.error('Error: ',error))
  .finally(() => console.log('Done!'));

Promise Chain

3. Áp dụng in số thứ tự sau mỗi giây

3.1 Bài tập

Bài tập: In ra màn hình các số theo thứ tự sau mỗi giây, không dùng setInterval.

function sleep(ms) {
  return new Promise(function (resolve) {
    setTimeout(() => {
      return resolve();
    }, ms);
  });
}

function sleep(ms) {
  return new Promise(function (resolve) {
    setTimeout(resolve, ms);
  });
}

sleep(1000)
  .then(function (data) {
    console.log(1);
    return sleep(1000);
  })
  .then(function (data) {
    console.log(2);
    return sleep(1000);
  })
  .then(function (data) {
    console.log(3);
    return sleep(1000);
  })
  .then(function (data) {
    console.log(4);
    return sleep(1000);
  })
  .then(function (data) {
    console.log(5);
    return sleep(1000);
  })
  .catch((error) => console.error('Error: ', error))
  .finally(() => console.log('Done!'));
function sleep(ms, data) {
  return new Promise(function (resolve) {
    setTimeout(() => resolve(++data), ms);
  });
}

sleep(1000, 0)
  .then(function (data) {
    console.log(data);
    return sleep(1000, data);
  })
  .then(function (data) {
    console.log(data);
    return sleep(1000, data);
  })
  .then(function (data) {
    console.log(data);
    return sleep(1000, data);
  })
  .then(function (data) {
    console.log(data);
    return sleep(1000, data);
  })
  .then(function (data) {
    console.log(data);
    return sleep(1000, data);
  })
  .then(function (data) {
    console.log(data);
    return sleep(1000, data);
  })
  .catch((error) => console.error('Error: ', error))
  .finally(() => console.log('Done!'));

3.2 Xử lý

function printLog(ms, count) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      count++;
      console.log(count);
      return resolve(count);
    }, ms);
  });
}

printLog(1000, 0)
  .then((data) => printLog(1000, data))
  .then((data) => printLog(1000, data))
  .then((data) => printLog(1000, data))
  .then((data) => printLog(1000, data))
  .then((data) => printLog(1000, data))
  .then((data) => printLog(1000, data))
  .then((data) => printLog(1000, data))
  .then((data) => printLog(1000, data))
  .then((data) => printLog(1000, data))
  .catch((error) => console.error('Error: ', error))
  .finally(() => console.log('Done!'));

Promise Chain