// 宣告建構式
function Promise(executor) {
// 添加默認屬性
this.PromiseState = 'pending';
this.PromiseResult = '';
// 接受多個then鏈式呼叫
this.callbacks = [];
const self = this;
// resolve函式
function resolve(data) {
if (self.PromiseState !== 'pending') return;
// 修改物件的狀態
self.PromiseState = 'fulfilled';
// 設定物件結果的值
self.PromiseResult = data;
// 執行成功的回呼
self.callbacks.forEach(item => {
item.onResolved(data)
})
}
// reject函式
function reject(data) {
if (self.PromiseState !== 'pending') return;
// 修改物件的狀態
self.PromiseState = 'rejected';
// 設定物件結果的值
self.PromiseResult = data;
self.callbacks.forEach(item => {
item.onRejected(data)
})
}
// 宣告執行器函式
try {
executor(resolve, reject);
} catch (e) {
reject(e)
}
}
// 添加then方法
Promise.prototype.then = function (onResolved, onRejected) {
const self = this;
return new Promise((resolve, reject) => {
// 封裝函式
function callback(params) {
try {
let result = params(self.PromiseResult);
if (result instanceof Promise) {
result.then(v => {
resolve(v)
}, r => {
reject(r)
})
} else {
resolve(result)
}
} catch (e) {
reject(e)
}
}
// 呼叫回呼函式
if (this.PromiseState === 'fulfilled') {
callback(onResolved)
}
if (this.PromiseState === 'rejected') {
callback(onRejected)
}
// 判斷pending狀態
if (this.PromiseState === 'pending') {
// 保存回呼函式
this.callbacks.push({
onResolved() {
callback(onResolved)
},
onRejected() {
callback(onRejected)
}
})
}
})
}
let p = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('ok')
reject("err")
// throw "erro
}, 1000);
})
const res = p.then(value => {
console.log(value);
// return "oh yee"
// throw "error"
}, reason => {
throw "error"
// console.warn(reason);
})
console.log(res);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/264879.html
標籤:區塊鏈
下一篇:《cis股票交易術》讀后感
