Skip to content

Instantly share code, notes, and snippets.

@zymiboxpay
Last active March 9, 2017 08:43
Show Gist options
  • Save zymiboxpay/a678a3f14ecc3fb60851e744501edcc2 to your computer and use it in GitHub Desktop.
Save zymiboxpay/a678a3f14ecc3fb60851e744501edcc2 to your computer and use it in GitHub Desktop.
learn promise
<!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