规范
1.1 “promise”是一个具有then方法的对象或函数,其行为符合此规范。也就是说Promise是一个对象或者函数。
1.2 “thenable”是一个定义then方法的对象或函数,说句人话也就是这个对象必须要拥有then方法。
1.3 “value”是任何合法的JavaScript值(包括undefined、或者promise)。
1.4 promise中的异常需要使用throw语句抛出。
1.5 当promise失败的时候需要给出失败的原因。
状态
1.1 promise必须要拥有三个状态: pending, fulfilled 和 rejected。
1.2 当promise的状态是pending时,他可以变为成功fulfilled或者失败rejected。
1.3 如果promise是成功状态,则他不能转换成任何状态,而且需要一个成功的值,并且这个值不能被改变。
1.4 如果promise是失败状态,则他不能转换成任何状态,而且需要一个失败的原因,并且这个值不能被改变。
then方法说明
1.1 一个promise必须要有一个then方法,而且可以访问promise最终的结果,成功的值。
1.2 then方法需要接收两个参数,onFulfilled 和 onRejected这两个参数是可选参数。
catch方法说明
1.1 一个promise必须要有一个catch方法,而且可以访问promise最终的结果,失败的值。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
| (function () {
function Promise(executor) { const _self = this; _self.status = 'pending' _self.result _self.error _self.onResolvedCallbacks = [] _self.onRejectedCallbacks = []
function resolve(res) { if (_self.status !== 'pending') return _self.status = 'fulfilled' _self.result = res
_self.onResolvedCallbacks.forEach(function (fn) { fn(); }) }
function reject(error) { if (_self.status !== 'pending') return _self.status = 'rejected' _self.error = error _self.onRejectedCallbacks.forEach(function (fn) { fn(_self.error); }) }
try { executor(resolve, reject) } catch (e) { reject(e); } }
Promise.prototype.then = function (onFulfilled, onRejected) { const _self = this;
onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : function (data) { return data; }; onRejected = typeof onRejected === 'function' ? onRejected : function (err) { throw err; };
const nextPromise = new Promise(function (resolve, reject) { if (_self.status === 'fulfilled') { try { const thenFnRes = onFulfilled(_self.result); resolvePromise(nextPromise, thenFnRes, resolve, reject); } catch (e) { reject(e) } }
if (_self.status === 'rejected') { try { const thenFnRes = onRejected(_self.error); resolvePromise(nextPromise, thenFnRes, resolve, reject); } catch (e) { reject(e) } }
if (_self.status === 'pending') { _self.onResolvedCallbacks.push(function () { try { const thenFnRes = onFulfilled(_self.result); resolvePromise(nextPromise, thenFnRes, resolve, reject); } catch (e) { reject(e) } });
_self.onRejectedCallbacks.push(function () { try { const catchFnRes = onRejected(_self.error); resolvePromise(nextPromise, thenFnRes, resolve, reject); resolve(catchFnRes) } catch (e) { reject(e) }
}); } })
return nextPromise }
Promise.prototype.catch = function (errorhandler) { Promise.then(null, errorhandler) }
function resolvePromise(nextPromise, thenFnRes, resolve, reject) {
if (!thenFnRes) { resolve(thenFnRes) return; }
let called;
if (nextPromise === thenFnRes) { return reject(new TypeError('循环引用了,请检查then函数return数据是否正确!')) }
if (typeof thenFnRes === 'object' || typeof thenFnRes === 'function') { try { let then = thenFnRes.then; then.call(thenFnRes, function (y) { if (called) { return; } called = true; resolvePromise(nextPromise, y, resolve, reject) }, function (r) { if (called) { return; } called = true; reject(r); });
} catch (e) { if (called) { return; } called = true; reject(e); } } else { if (called) { return; } called = true; resolve(thenFnRes) } resolve(thenFnRes) }
})();
|
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| const p = new Promise(function (resolve, reject) { setTimeout(function () { resolve(1); }, 1000) })
p.then(res => { console.log('then1:', res) return res + 1 }) .then() .then(res => { console.log('then3:', res) return new new Error() }) .catch(res => { console.log('catch:', res) })
|