Last active
March 9, 2017 08:43
-
-
Save zymiboxpay/a678a3f14ecc3fb60851e744501edcc2 to your computer and use it in GitHub Desktop.
learn promise
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>Document</title> | |
</head> | |
<body> | |
<script> | |
(function() { | |
var id = 0; | |
function generateId() { return id++; }; | |
Object.prototype.id = function() { | |
var newId = generateId(); | |
this.id = function() { return newId; }; | |
return newId; | |
}; | |
})(); | |
function Promise(fn){ | |
var value = null | |
var state = 'pending' | |
var deferreds = [] | |
this.then = function(onFulfilled, onRejected){ | |
return new Promise(function(resolve, reject){ | |
handle({ | |
onFulfilled: onFulfilled || null, | |
onRejected: onRejected || null, | |
resolve: resolve, | |
reject: reject | |
}) | |
}) | |
} | |
function handle(deferred){ | |
if(state === 'pending'){ | |
deferreds.push(deferred) | |
return | |
} | |
var cb = state === 'fulfilled' ? deferred.onFulfilled : deferred.onRejected | |
if(cb === null){ | |
cb = state === 'fulfilled' ? deferred.resolve : deferred.reject | |
cb(value) | |
return | |
} | |
try{ | |
ret = cb(value) | |
deferred.resolve(ret) | |
} | |
catch(e){ | |
deferred.reject(e) | |
} | |
} | |
function resolve(newValue){ | |
try { | |
if(newValue && (typeof newValue === 'object' || typeof newValue === 'function')){ | |
var then = newValue.then | |
if(typeof then === 'function'){ | |
then.call(newValue, resolve, reject) | |
return | |
} | |
} | |
value = newValue | |
state = 'fulfilled' | |
finale() | |
} | |
catch(e){ | |
reject(e) | |
} | |
} | |
function reject(reason){ | |
value = reason | |
state = 'rejected' | |
finale() | |
} | |
function finale(){ | |
setTimeout(function(){ | |
deferreds.forEach(function(deferred){ | |
handle(deferred) | |
}) | |
},0) | |
} | |
fn(resolve, reject) | |
} | |
function getUserId(){ | |
return new Promise(function(resolve){ | |
setTimeout(function(){ | |
resolve('1') | |
}, 2000) | |
}) | |
} | |
function getUserMobileById(id) { | |
return new Promise(function (resolve) { | |
setTimeout(function(){ | |
resolve('18682262011') | |
}, 2000) | |
}) | |
} | |
getUserId() | |
.then(getUserMobileById) | |
.then(function (mobile) { | |
console.log(mobile); | |
}, function(error){ | |
console.log(error) | |
}) | |
.then(null, function(error){ | |
console.log(error) | |
}) | |
</script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment