Promise

Promise

中級

はじめに

Promiseクラスが登場する前は、非同期のコードを扱う方法が1つしかありませんでした。それが、_コールバックパターン_です。

コールバックとは、別の関数に引数として渡される関数で、その渡した先の関数で何らかの処理が終わると呼び出されます。そうしたコールバック関数では、最初の引数としてerrorを受け取るという書き方がよく使われます(下の例を見てください)。

function callback(error, arg2, arg3) {}

これと非同期コードには、どんな関係があるのでしょうか?

これまでコールバックは、非同期の処理が終わったあとに、プログラム全体を止めることなく何らかの作業を行うために使われてきました。

fetchProduct(productId, function (error, data) {
  if (error) {
    // Handle the error
  } else {
    // Do some work
  }
});

上の例で、fetchProduct関数(非同期の関数です)は、2番目の引数としてコールバックを受け取ります。商品のデータを取得したあとに何をするかは、このコールバックが決めます。

説明

この演習の目的は2つあります。

  1. 「コールバックパターン」を使う関数を、Promiseを返す関数に変えるpromisify関数を実装します。次の例を見てみましょう。
function fetchProduct(productId, function(error, data) {
    if (error) {
        // Handle the error
    } else {
        // Make something with your data
    }
})

const fetchProductAsPromise = promisify(fetchProduct);

// Now you got a function `fetchProductAsPromise`
// that returns a promise
fetchProductAsPromise(productId)
    .then((data) => {})
    .catch((error) => {});
  1. 次の組み込みのPromiseメソッドを、それらを使わずに再実装します。
  • all:プロミスの配列を受け取り、_すべて_が解決したときに解決し、_1つ_でも拒否されたときに拒否します。
  • allSettled:プロミスの配列を受け取り、_すべて_が解決または拒否されたときに解決します。
  • race:プロミスの配列を受け取り、_最初_に解決または拒否されたプロミスの値で解決または拒否します。
  • any:プロミスの配列を受け取り、_1つ_が解決したときに解決し、_すべて_が拒否されたときに拒否します。
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
JavaScript Exercism

Promiseを始める準備はできましたか?

Exercismに登録すれば、37個のコンセプト159個の演習、そして本物の人間によるメンタリングとともに、JavaScriptを学んでマスターできます。すべて無料です。