手書きPromise,1.5 promiseでthenメソッドのチェーン呼び出しPromiseオブジェクト自体を識別する
2693 ワード
promiseのthenメソッドはpromiseオブジェクトを返します.ユーザーがコードを書く過程で、自分自身を返すと、タイプエラーが報告されます.テストコード:
コンソールに次のように印刷し、ループコールをプロンプトします.
そのため、前のコードで必要な判断をする必要があります.自分自身を返す場合は、タイプエラーを報告します.
しかし、このコードには問題があり、
テストコードを修正します
コンソール印刷
テストに成功しました.
Promise.then
var p = new Promise(function (resolve, reject) {
resolve(100);
})
var p1 = p.then(function (value) {
console.log(value)
return p1;
})
p1.then(function () {}, function (resson) {
console.log(resson.message)
})
コンソールに次のように印刷し、ループコールをプロンプトします.
100
Chaining cycle detected for promise #
そのため、前のコードで必要な判断をする必要があります.自分自身を返す場合は、タイプエラーを報告します.
resolvePromise
メソッドにパラメータを追加し、thenメソッドでpromiseオブジェクトを返します.function resolvePromise(promise2, e, resolve, reject) {
if (promise2 === e) {
return reject(new TypeError("Chaining cycle detected for promise #"))
}
if (e instanceof MyPromise) {
// promise
// e.then((value) => {
// resolve(value)
// }, (reason) => {
// reject(reason)
// })
//
e.then(resolve, reject);
} else {
//
resolve(e);
}
}
しかし、このコードには問題があり、
resolvePromise
メソッドはthenメソッドのpromiseのアクチュエータに存在する.彼の最初のパラメータはpromiseオブジェクトの戻り値であり、resolvePromise
はこの戻り値を取得できません.これは明らかに問題があります.解決策はthenメソッドで状態を判断した後の論理コードを非同期コードにプログラミングし,すべての同期を先に実行させpromise戻り値が存在することである.このとき、resolvePromise
は、new Promise
の戻り値を取得することができる. if (this.status === FULFILLED) {
setTimeout(() => {
// , then
let successRtn = successCallback(this.value);
// x promise
// resolve
// promise promsie
// promise resolve reject
// resolve , then
resolvePromise(promise2, successRtn, resolve, reject);
}, 0);
}
テストコードを修正します
let promise = new MyPromise((resolve, reject) => {
resolve('---success----');
})
let p1 = promise.then(value => {
console.log(value);
return p1;
}, reason => {
console.log(reason)
})
p1.then(value => {
console.log(value)
},reason=>{
console.log(reason)
})
コンソール印刷
---success----
TypeError: Chaining cycle detected for promise #
テストに成功しました.