## 外から呼ぶテクニック
src: [Resolve Javascript Promise outside the Promise constructor scope - Stack Overflow](https://stackoverflow.com/questions/26150232/resolve-javascript-promise-outside-the-promise-constructor-scope)
Promise をコンストラクタの外部から解決状態にしたい場合がある。そのような場合では、次のようなパターンを使って行う。
まず [[Javascriptの変数宣言|let宣言]] で外部に [[JavaScript Promiseコンストラクタ|resolve関数]] と [[JavaScript Promiseコンストラクタ|reject関数]] への参照をもたせるようにして、外部から呼び出すようにする。
```js
// まずは束縛するための変数を定義
let promiseResolve, promiseReject;
const promise = new Promise((resolve, reject) => {
// resolve関数を外部の変数に束縛
promiseResolve = resolve;
// reject関数を外部の変数に束縛
promiseReject = reject;
});
// 外部から解決する
promiseResolve();
```
```js
// resolvePromiseMethod.js
console.log("🦖 [1] MAINLINE: Start");
let resolvePromise, rejectPromise;
const promise = new Promise((resolve, reject) => {
resolvePromise = resolve;
rejectPromise = reject;
});
promise.then((data) => console.log("👍 [5] 後から解決出来た/履行値:", data))
.catch((error) => console.log("😭 [5] 拒否状態", error));
setTimeout(() => {
console.log("⏰ [3] TIMER: setTimeout callback");
resolvePromise("😼 履行値も定めることができる"); // 外部から resolve する
// rejectPromise(); // 一度しか意味がない
console.log("⏰ [4] >> Promise をコンストラクタ外から解決をトリガーする");
}, 5000);
console.log("🦖 [2] MAINLINE: End");
```
実行結果はこうなる。
```sh
❯ deno run resolvePromiseMethod.js
🦖 [1] MAINLINE: Start
🦖 [2] MAINLINE: End
⏰ [3] TIMER: setTimeout callback
⏰ [4] >> Promise をコンストラクタ外から解決をトリガーする
👍 [5] 後から解決出来た/履行値: 😼 履行値も定めることができる
```
## プロポーザル
src: https://zenn.dev/sosukesuzuki/articles/41721cbbb86ff5
結局のところ上記のようなテクニックの何が嬉しいかといえば、**解決や拒否のタイミングを自分で決めることができる**ということである。
このようなことをしたい場合には、これまで上記のテクニックを利用したり、[[windowのメソッド setTimeout関数|setTimeout関数]] などを利用しないかぎり [[JavaScriptのPromiseオブジェクト MOC|Promise]] オブジェクトの生成をした後から解決や拒否をすることができなかった。
ただし、[[ECMAScript Promise.withResolvers|Promise.withResolvers]] という [[ECMAScriptのプロポーザル|プロポーザル]] が [[ECMAScript 2024|ES2024]] で追加されたので、これが利用できるようになれば以下のようなテクニックをわざわざ使う必要がなくなる。