手寫乙個promise

2022-04-27 17:47:40 字數 2755 閱讀 1864

promise a+ 規範:

注:以下**沒有通過promises-aplus-tests的全部測試,但基本功能還是全的( 測試結果: 864 passing, 8 failing)

另外可以參考這個指南中的 promise實現

// promise resolve_100+ 規範:

class mypromise

};const reject = (rejectreason) =>

};try catch (e)

}then(onresolved, onrejected) catch (e)

};const afterrejected = reason => catch (e)

};// 2.1

switch (this.state)

});return promise2;

}// 執行所有的 onresolved

_doresolve() );

}// 執行所有的 onrejected

_doreject() );

}// then(null, onrejected) 的別名

catch(onrejected)

static resolve(val) );

}static reject(reason) );

}static all(promiselist)

}).catch(err => );

});});

}static race(promiselist) );

});}

// 下面兩個是為了測試才加的

static deferred() ;

dfd.promise = new mypromise(function (resolve, reject) );

return dfd;

}static defer() ;

dfd.promise = new mypromise(function (resolve, reject) );

return dfd;

}}// 處理onresolve返回promise時的情況

function resolvepromise(promise, x, resolve, reject)

try ,

reason =>

);} else

} else

} catch (e)

}try catch (e)

function test(promiseconstructor) 

const testcase = [

);let reject_immediate = promiseconstructor.reject('immediate');

reject_immediate.catch(value => );}},

, 100);

}).then(val => log('resolve', val));

new promiseconstructor((resolve, reject) => , 100);

}).catch(val => log('reject1', val));}},

, 100);

}).then(value => )

.catch(value => )

.then(value => )

.catch(value => )

.then(value => )

.catch(log);}},

, 100);

}).then(value => );

});})

.then(value => )

.then(value => );

});})

.catch(value => );}},

);promiseconstructor.all([

promiseconstructor.reject(1),

promiseconstructor.resolve('我不出現1'),

promiseconstructor.reject('我不出現2'),

]).then((err) => )

.catch(log);}},

, 200);

}),new promiseconstructor(resolve => , 100);

})])

.then(log)

.catch((err) => );

promiseconstructor.race([

promiseconstructor.reject(1),

promiseconstructor.resolve('我不出現1'),

promiseconstructor.reject('我不出現2'),

]).then((err) => )

.catch(log);}},

, 100);

}).then(value => )

.then(value => );

// 不知道為什麼,這裡如果加乙個.catch或者.then就不會報錯了

// 原生的promise也是這樣}}

];for (let i = 0, len = testcase.length; i < len; i++) , 900);

}, i * 1000);}}

test(mypromise);

test(promise);

手寫乙個Promise

js物件導向 在js中一切皆物件,但js並不是一種真正的物件導向 oop 的語言,因為它缺少類 class 的概念。雖然es6引入了class和extends,使我們能夠輕易地實現類和繼承。但js並不存在真實的類,js的類是通過函式以及原型鏈機制模擬的,本小節的就來 如何在es5環境下利用函式和原型...

手寫乙個Promise(1)

promise作為目前最受歡迎的js非同步程式設計解決方案,重要性不言而喻,今天就來實現乙個自己的promise。首先宣告類,新增幾個靜態屬性代表promise的狀態 class eswang 接著寫建構函式,主要是兩個類屬性,乙個代表狀態,使用剛剛的靜態屬性,乙個代表promise的值,初始為nu...

手寫乙個Promise(3)

then還沒有寫好。then的鏈式處理我們要對reject做一定的修改。if this status eswang.fufilled catch error 我們可以看到,fufilled狀態中,catch的reject使用的是新new的reject,而不是then中的函式引數。同樣需要這樣操作的還...