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中的函式引數。同樣需要這樣操作的還...