主にまだプロミスに対応していない関数をラップするために使用します。→
| executor | 新しい Promise オブジェクトを構築する過程でコンストラクターによって呼び出される関数(function)です。executor は結果をプロミスに結びつけるカスタムコードです。プログラマーが executor を書きます。この関数の形式は次のようなものであると期待されます。
function(resolutionFunc, rejectionFunc){
// 通常は非同期操作です。
}
resolutionFunc と rejectionFunc も関数で、実際には好きな名前を付けることができます。呼び出し形式は単純で、単一の任意の型の引数を受け付けます。 resolutionFunc(value) // 解決した時に呼び出し rejectionFunc(reason) // 拒否した時に呼び出し resolutionFunc の value 引数は他のプロミス オブジェクトにすることもでき、そうするとそのプロミスはプロミス連鎖の中に動的に挿入されます。 executor については、以下のことを理解することが重要です。
つまり、executor の中のコードが効果を発揮する仕組みは、次のようなものです。
以上のことを踏まえて、典型的な流れをまとめてみました。
|
|---|
new を通じて呼び出された場合、Promise コンストラクターはプロミス オブジェクトを返します。このプロミス オブジェクトは、resolutionFunc 関数または rejectionFunc 関数が呼び出されると「解決」になります。なお、resolutionFunc または rejectionFunc を別な Promise オブジェクトを引数にして呼び出すと、これが「解決」であると言えますが、「満足」であるとは言えません。
Promise オブジェクトは new キーワードとコンストラクターで作成されます。コンストラクターは「executor 関数」と呼ばれる引数を取ります。これは 2 つの関数を引数として取ります。1 つ目の関数(resolve)は非同期タスクが成功して完了した場合に呼び出され、タスクの結果を値として返します。2 つ目の関数(reject)はタスクが失敗した場合に呼び出され、失敗した理由(ふつうはエラー オブジェクト)を返します。
const myFirstPromise = new Promise((resolve, reject) => {
// 次のどちらかを呼び出す非同期処理を行います。
//
// resolve(someValue) // 履行
// または
// reject("failure reason") // 拒否
});
Promise を返す関数の作成:
関数にプロミス機能を提供するには、次のように単にプロミスを返すようにします。
function myAsyncFunction(url){
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest()
xhr.open("GET", url)
xhr.onload = () => resolve(xhr.responseText)
xhr.onerror = () => reject(xhr.statusText)
xhr.send()
});
}