Promise/A+仕様に合うPromiseを実現します.
3449 ワード
簡単に紹介します.Promiseはチェーン式で呼び出された方式で「リセット地獄」の問題を解決できます.特に非同期の過程で、Promiseを通じてコードの清潔性と可読性を保証できます.
この記事では、Promise/A+仕様を紹介し、この仕様に基づいて、自分でPromiseを実現します.
一、Promiseの使用
Promise仕様を知る前に、我々は主流の高バージョンブラウザがECMAのPromiseをサポートしていることを知っています.
プロモーションの例を作成します.
上記の例から、プロミスは非同期的な操作を容易にすることが分かる.またプロモーションはチェーン式の呼び出しも可能です.
二、Promise/A+仕様
Promise/A+仕様には大体以下の内容があります.
1.用語(1)「promise」は、オブジェクトまたは関数であり、オブジェクトまたは関数は、then方法(2)「thenable」はオブジェクトまたは関数であり、then方法(3)「value」はpromise状態が成功したときの値(4)「reason」はpromise状態が失敗したときの値であると定義し、用語の目的を明確にします.
2.要求(1)一つのpromiseは3つの状態、pending、fulfilled、rejectiedが必要です.pending状態にあるときは、fulfilledまたはrejectied状態に移行することができます.fulfilled状態またはrejectied状態にあるときは、可変できません.プロミスは承諾と訳されています.つまりプロミスの状態が一度変わったら、永遠に不可逆です.
(2)一つのpromiseにはthen方法が必要であり、then方法は二つのパラメータを受け入れる:
(3)チェーンコールを実現するために、then方法はプロミスに戻さなければならない.
Promise/A+仕様を知ったら、どうやってPromiseを実現しますか?まずmyPromise関数を作成します.すべての変数と関数名については仕様と同じです.
1.v 1.0初期バージョンmyPromise
…
この記事では、Promise/A+仕様を紹介し、この仕様に基づいて、自分でPromiseを実現します.
一、Promiseの使用
Promise仕様を知る前に、我々は主流の高バージョンブラウザがECMAのPromiseをサポートしていることを知っています.
プロモーションの例を作成します.
let p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("success");
}, 3000);
console.log("this is a promise");
});
p1.then(value => {
console.log(value);
});
// :
// :this is a promise
// 3000ms :success
上記はpromiseの例であり、出力内容は「this is a promise」であり、300 ms遅延後に「success」を出力します.上記の例から、プロミスは非同期的な操作を容易にすることが分かる.またプロモーションはチェーン式の呼び出しも可能です.
let p2 = new Promise((resolve, reject) => {
resolve();
});
p2.then(...).then(...).then(...);
このほかPromiseはthenメソッドのほか、Promise.resove、Promise.all、Promise.raceなどの方法を提供しています.二、Promise/A+仕様
Promise/A+仕様には大体以下の内容があります.
1.用語(1)「promise」は、オブジェクトまたは関数であり、オブジェクトまたは関数は、then方法(2)「thenable」はオブジェクトまたは関数であり、then方法(3)「value」はpromise状態が成功したときの値(4)「reason」はpromise状態が失敗したときの値であると定義し、用語の目的を明確にします.
2.要求(1)一つのpromiseは3つの状態、pending、fulfilled、rejectiedが必要です.pending状態にあるときは、fulfilledまたはrejectied状態に移行することができます.fulfilled状態またはrejectied状態にあるときは、可変できません.プロミスは承諾と訳されています.つまりプロミスの状態が一度変わったら、永遠に不可逆です.
(2)一つのpromiseにはthen方法が必要であり、then方法は二つのパラメータを受け入れる:
promise1.then(onFulfilled, onRejected);
その中でオンフルfilled方法は状態がpending->fulfilledから実行される方法を表していますが、オンリージェクトは状態がpending->rejecedから実行される方法を表しています.(3)チェーンコールを実現するために、then方法はプロミスに戻さなければならない.
promise2 = promise1.then(onFulfilled, onRejected);
三、Promise/A+仕様に合うPromiseを実現する.Promise/A+仕様を知ったら、どうやってPromiseを実現しますか?まずmyPromise関数を作成します.すべての変数と関数名については仕様と同じです.
1.v 1.0初期バージョンmyPromise
function myPromise(constructor) {
let self = this;
self.status = 'pending';
self.value = undefined; //
self.reason = undefined; //
function resolve (value) {
// 1. pending resolved
if (self.status === 'pending') {
self.value = value;
self.status = 'resolved';
}
}
function reject (reason) {
// 2. pending rejected
if (self.status === 'pending') {
self.reason = reason;
self.status = 'rejected';
}
}
try {
constructor(resolve, reject);
} catch(e) {
reject(e);
}
}
また、myPromiseの原型にチェーン呼び出しを定義するthen方法が必要です.myPromise.prototype.then = function (onFullfilled, onRejected) {
let self = this;
switch (self.status) {
case 'resolved':
onFullfilled(self.value);
break;
case 'rejected':
onRejected(self.reason);
break;
}
};
上記は初期バージョンのmyPromiseです.myPromiseで状態が変わって、それぞれのthenメソッドで状態によって操作ができます.let mp = new myPromise(function (resolve, reject) {
resolve(1);
// reject('err msg');
});
mp.then(function (res) {
console.log(res);
}, function (err) {
console.log(err);
});
// 1
しかしここはmyPromiseでは非同期のresoliveを処理できません.たとえば:let mp1 = new myPromise(function (resolve, reject) {
setTimeout(() => {
resolve(2);
}, 2000);
});
mp1.then(function (res) {
console.log(res);
});
//
2.v 2.0は観察モードに基づいて実現される.…