Promise -> has a metadata "then" array storing list of functions
until resolve, the promise object puts the "then" list of functions into the queue
( previously store in the promise metadata )
javascript run through the queue
Ex 1
=============================
console.log('a');
setTimeout(function bbb() {
console.log('bbb start');
setTimeout(function bbb2() {
console.log('bbb2 here');
}, 1000);
console.log('bbb end');
}, 1000);
console.log('c');
'abc'
=============================
Result:
a
c
abc
bbb start
bbb end
bbb2 here
Ex 2
=============================
console.log('a');
var bPromise = new Promise(resolve => {
setTimeout(function bbb() {
console.log('b');
resolve(123);
}, 1000);
});
setTimeout(function ddd() {
bPromise.then(function eee() {
console.log('e');
});
}, 7000);
bPromise.then(function ccc() {
console.log('c1');
});
bPromise.then(function ccc2() {
console.log('c2');
});
console.log('oh');
'abc'
=============================
Result:
a
oh
abc
b
c1
c2
e
Ex 3
=============================
console.log('a');
var bPromise = new Promise(function (resolve) {
console.log('b');
setTimeout(function bbb() {
console.log('bbb');
resolve(123);
}, 1000);
});
var thenPromise = bPromise.then(function ccc() {
console.log('ccc');
return new Promise(resolve => {
setTimeout(function eee() {
console.log('e');
resolve(123);
}, 1000);
});
});
var thenPromise1 = bPromise.then(function ccc1(param) {
console.log('ccc1');
return 345;
});
thenPromise.then(function ddd(param) {
console.log('ddd');
});
'abc'
=============================
Result:
a
b
abc
bbb
ccc
ccc1
e
ddd
Ex 4
=============================
//create a class http which has get method which returns instance of promise
function http(url) {
this.get = new Promise(function(resolve, reject) {
var client = new XMLHttpRequest();
console.log('here');
client.open('get', url);
client.send();
client.onload = function () { //If you observe carefully this is also registering a callback fn
if (this.status == 200) {
console.log('resolve');
resolve(this.response);
} else {
console.log('reject');
reject(this.statusText);
}
};
client.onerror = function () { reject(this.statusText); }
});
}
//using http module
var successCallBack = function(res) {
console.log(res);
}
new http('/admin').get.then(successCallBack);
============================
沒有留言:
張貼留言