human
JavaScriptの約束について教えてもらえますか？
gpt
もちろんだ。プロミスは、例えばコールバックを直接使うよりもずっとエレガントで実用的な方法で非同期問題を解決するためのコンセプトだ。

## プロミスとは？

その名前が示すように、プロミスとは、最初は実現されると考えているものですが、将来いくつかのことが起こる可能性があります：
- プロミスが**満たされる**(プロミスが解決される)。
- 約束が**果たされない**（約束が拒否される）。
- 約束が**不確かな状態**にいつまでも留まる（約束が保留される）。

これらの簡単な基本を理解することで、Javascriptでプロミスがどのように機能するかを理解することができます。始める前に、プロミスには2つの重要な部分があることも明確にしておく必要があります：**プロミスを消費する方法**（プロミスの使用__）と、プロミスを作成する方法**（プロミスを使用する関数の準備__）です。

## JavaScriptの約束

Javascriptの約束は``オブジェクト``で表現され、それぞれの約束は保留、受諾、拒否という特定の状態になります。さらに、各プロミスは以下のメソッドを持っており、それを使用することができます：

| メソッド** | **説明** |
|:---:|:---:|
| ``.then(FUNCTION resolve)`` | プロミスが満たされた時に ``resolve`` コールバック関数を実行する。
| | ``.catch(FUNCTION reject)`` | 約束が拒否されたときに ``reject`` コールバック関数を実行します。|
| | ``.then(FUNCTION resolve, FUNCTION reject)`` | 同じ ``.then()`` の中で、前の2つと同等のメソッドです。|
| | ``.finally(FUNCTION end)`` | 成功時と拒否時の両方で ``end`` コールバック関数を実行する。|

## プロミスを消費する

プロミスを消費する一般的な方法は、1つのパラメータで ``.then()`` を使用することです：

```js
fetch("/robots.txt").then(function(response) {
  /* Código a realizar cuando se cumpla la promesa */
});
```

前の例で見たのは、``fetch()``関数の使用です。この関数は、リクエストからのレスポンスを取得したときに満たされるプロミスを返します。このようにして、リクエストのレスポンスに応答するコードの動作を（読みやすい方法で）準備することになります。

プロミスが拒否されたときに ``.catch()`` メソッドを使うことができることを覚えておいてください：

```js
fetch("/robots.txt")
  .then(function(response) {
    /* Código a realizar cuando se cumpla la promesa */
  })
  .catch(function(error) {
    /* Código a realizar cuando se rechaza la promesa */
  });
```
.then()``メソッドと ``.catch()``メソッドをインデントしていることに注目してください。また、プロミスを生成し続けて ``return`` で返す場合は、 ``.then()`` を複数連結することができます：

```js
fetch("/robots.txt")
  .then(response => {
    return response.text(); // Devuelve una promesa
  })
  .then(data => {
    console.log(data);
  })
  .catch(error => { /* Código a realizar cuando se rechaza la promesa */ });
```

> 以下のプロミスを ``.then()`` でチェーンできるように、``return`` を忘れないでください。また、``.catch()`` の後に ``.then()`` をつなげてプロミスの処理を続けることもできます。

実際、**arrow 関数** を使用することで、このコードの可読性をさらに向上させることができます。**arrow 関数** のボディにステートメントが 1 つしかない場合、暗黙の **return** があることを覚えておいてください：

```js
fetch("/robots.txt")
  .then(response => response.text())
  .then(data => console.log(data))
  .finally(() => console.log("Terminado."))
  .catch(error => console.error(data));
```
また、``.finally()``メソッドを追加して、**約束が達成されるか拒否されるか**に関わらず実行されるコールバック関数を追加していることにも注意してください。これにより、``.then()``や``.catch()``で関数を繰り返す必要がなくなります。

> このセクションを通して、私たちは ``.then()`` を使ってプロミスを利用する方法を見てきました。しかし、次のセクションで、プロミスを作成したり、後で利用するためにプロミスを実装する方法について説明します。

## プロミスを使った非同期処理

プロミスを使って次の練習をしてみましょう：

numbers``という配列があり、そこに数字を入れる。numbers``という配列があり、そこに数字を挿入する。各反復には ``numbers`` が挿入される。これはダイスのシミュレーションによって生成されたものである（_1から6までの乱数）。6の場合、ループを中断する：

最初に行うことは、 ``doTask()`` タスク関数全体を ``wrapped`` する新しい ``PROMISE`` オブジェクトを作成することです。

この ``new Promise()`` は2つのコールバックを持つ関数をパラメータとして渡されます。最初の ``resolve`` はプロミスが達成されたときに使用し、2番目の ``reject`` はプロミスが拒否されたときに使用します：

```js
const iterations = 10;
const numbers = [];

/* Implementación con promesas */
const doTask = (iterations) => new Promise((resolve, reject) => {
  const numbers = [];
  for (let i = 0; i < iterations; i++) {
    const number = 1 + Math.floor(Math.random() * 6);
    numbers.push(number);
    if (number === 6) {
      reject({
        error: true,
        message: "Se ha sacado un 6"
      });
    }
  }
  resolve({
    error: false,
    value: numbers
  });
});
```

ダイスを投げるたびに**（乱数を生成する部分）より高価な処理が行われ、**かなりの時間がかかる**場合を想像してみてください。

この情報がお役に立てば幸いです。何か質問があればお知らせください。