👌

コンストラクタの外からresolve/rejectを呼ぶPromsieテク

2023/06/04に公開

Promsie を作って返す関数で、Promise コンストラクタの引数のコールバックではないところで resolve とか reject とかしたいことがある。

こんな感じで、外部に変数を作って普通に代入して外から resolve/reject を呼べるテクがある。

function registerSomething() {
  let resolve, reject;
  const promise = new Promise((res, rej) => {
    resolve = res;
    reject = rej;
  });

  something.registerSomething((error, info) => {
    if (error) reject(error);
    resolve(info);
  })

  return promise;
}

まあ実際には、上記コードくらいだったら普通にコンストラクタの中でやってよさそうだけど。

行儀悪い感じだし、できればやりたくはない感じがある。ということで、現在 TC39 では Promise with resolvers というプロポーザルが提案されている。

https://github.com/tc39/proposal-promise-with-resolvers

const { promise, resolve, reject } = Promise.withResolvers();

みたいな感じらしい。たまに便利そう。

Discussion