Promise Back

Promise is used for asynchronous calculating, which is an object which means that it will be done in the future.

var promiseObj = new Promise(function (resolve, reject)) {
    /** calling resolve when the job is done */
    resolve();

    /** calling reject when the job failed */
    reject();
};

A Promise object will only have three states:

  • pending: the initial state
  • fulfilled: successful state
  • rejected: failed state

Prototype functions

There are 2 prototype functions: then() and catch(), which both will return a Promise object (So we can use chain operations).

When a Promise object has changed its state, Promise.prototype.then() will be called according to the state:

promiseObj.then(function () {
    /** fulfilled state */
}, function () {
    /** rejected state */
});

In comparison with then(), catch() will only handle rejected state:

promiseObj.catch(function () {
    /** rejected state */
});

Other functions

all()

Promise.all(iterator) should return a promise, which can be only resolved until all promises in the iterator have been resolved, same as rejected.

race()

Promise.all(iterator) should return a promise, which will be resolved or rejected once one of the iterator has been resoved and rejected.

reject()

Promise.reject(reason) will return a promise, which has been rejected with the reason.

resolve()

Promise.resolve(reason) will return a promise, which has been resolved with the reason.

Compatibility

Q / Bluebird / Async / co / then / Babel has supported asynchronous programming.

How the task be executed?

Consider the following code snippet, and think about the order it execute.

setTimeout(function() {
    console.log(1)
}, 0); /** belongs to a macrotask */

new Promise(function executor(resolve) {
    /** this function will be executed at once */
    console.log(2);
    for( var i=0 ; i<10000 ; i++ ) {
        i == 9999 && resolve();
    }

    /** even though the following console is executed after resolving, it's still faster to be executed */
    console.log(3);
}).then(function() {
    /** belongs to a microtask */
    console.log(4);
});
console.log(5);

A microtask will be executed in the end of the current event loop, while a macrotask will be executed in the next event loop.

So the console log should be: 2, 3, 5, 4, 1.

results matching ""

    No results matching ""