promise的简单实现 发表于 2017-09-28 | 分类于 编程 promise promise的作用是为了避免回调地狱 下面是promise的简单实现 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980function Promise(fn){ if (!fn){ return } var me = this; var state = "pending"; var successList = []; var failList = []; this.then = function(success, fail){ switch (state) { case "pending": var failFn = function(){return "null"} if(success.toString().match("Promise") != null){ failFn = function(){return me} } successList.push(success) failList.push(fail || failFn) return this; case "resolve": success(); return this; case "reject": fail(); return this; } } var resolve = function(value){ state = "resolve"; for(var i=0; i<successList.length; i++){ var tem = successList[i](value) if(tem instanceof Promise){ for(i++; i<successList.length; i++){ tem.then(successList[i], failList[i]) } }else{ value = tem } } } var reject = function(value){ state = "reject"; for(var i=0; i<failList.length; i++){ var tem = failList[i](value) if(tem instanceof Promise){ tem = successList[i](value) for(i++; i<failList.length; i++){ tem.then(successList[i], failList[i]) } }else{ value = tem } } } fn(resolve, reject)}var p = function (){ return new Promise(function(resolve, reject){ setTimeout(function(){ reject('p 的结果'); }, 1000); });}var p2 = function (input){ return new Promise(function(resolve, reject){ setTimeout(function(){ console.log('p2拿到前面传入的值:' + input) reject('p2的结果'); }, 3000); });}p().then(function(res){console.log('p的结果:' + res); return 'p then方法第一次返回'}, function(res){ console.log('p reject 的结果:' + res); return 'p reject then方法第一次返回reject'}).then(function(res){console.log('p第一次then方法的返回:'+res); return 'p then方法第二次返回'}, function(res){ console.log('p reject 第一次then方法的返回:'+res); return 'p reject then方法第二次返回reject'}).then(p2).then(function(res){console.log('p2的结果:' + res)}, function(res){ console.log('p2 reject 的结果:' + res) return "reject"});