Skip to content

Promises as a Convenience Structure for Async Code

Reminder: Promise provides a convenient way to structure our async code, but does not make our code run asynchronously. A blocking code wrapped with promises is still blocking code.

js
// =======SYNC OPERATION======== //

// sleeps for 5 seconds
function blockingCode() {
  var start = new Date().getTime();
  var expire = start + 5000;
  while (new Date().getTime() < expire) {}
}

function blockingCodeWithPromise() {
  return new Promise((resolve, reject) => {
    blockingCode();
    resolve('done');
  });
}

console.log('Main context start');

blockingCodeWithPromise().then((result) => console.log(result));

console.log('Main context end');

// RESULT
// 'Main context end' is printed with a 5 SECONDS delay
// i.e. Blocking code is blocking the main context

// =======ASYNC OPERATION======== //

// sleeps for 5 seconds
function blockingCode() {
  var start = new Date().getTime();
  var expire = start + 5000;
  while (new Date().getTime() < expire) {}
}

function blockingCodeWithPromise() {
  return new Promise((resolve, reject) => {
    process.nextTick(() => {
      blockingCode();
      resolve('done');
    });
  });
}

console.log('Main context start');

blockingCodeWithPromise().then((result) => console.log(result));

console.log('Main context end');

// RESULT
// 'Main context end' is printed immediately without delay
// i.e. Blocking code is run asynchronously without blocking the main context