bugfix> javascript > 投稿

ユーザーに値を要求するモーダルを生成するためのAPIがあり、そのモーダルを作成する呼び出しが、指定された値に解決するか、モーダルが閉じられた/キャンセルされた場合に拒否するプロミスを返します。例:

prompt("Enter a value.").then(val => { }).catch(() => { /* closed */ });

閉じたモーダルの拒否された約束を処理するために私が見た提案されたパターンは、 catch を追加することです上記のような「操作なし」ラムダを持つステートメント。これの問題は、モーダルのときにPromiseチェーンを構築したい場合 成功すると、後続のロジックのエラーも「操作なし」ラムダのためにサイレントに失敗します。

prompt("Enter a value.")
  .then(val => { /* logic that could throw an error */ })
  .then(() => { /* method that may return another promise */ })
  .catch(() => { }) // Silent fail
  .then(() => { /* logic after modal */ })

明らかな解決策は、 then を移動することです「操作なし」の後のステートメントをキャッチし、新しいステートメントでキャッチしますが、これらのブロックはモーダルが成功した場合にのみ実行する必要があるため、上記の catch の後に移動できないことに注意してくださいステートメント。

あなたならどうしますか?

回答 1 件
  • 私も最近似たようなものを実装し、私のアプローチはモーダルが undefined を返すことでした  クローズまたはキャンセルされた場合。 catch() を予約しようとしています  「true」エラーの場合。

    ただし、 throw できることも覚えておいてください   Error だけでなく、何でも s。したがって、代わりに、 throw することができます  モーダルが閉じられたことを認識でき、その場合は何もしません。それ以外の場合は、例外の処理に進みます。

    prompt.CLOSE_SIGNAL = Symbol('prompt.CLOSE_SIGNAL');
    prompt('Enter a value.')
    .then(/* ... */)
    .catch(ex => {
        if (ex === prompt.CLOSE_SIGNAL) return;
        // Otherwise:
        console.error('Error from modal:', ex);
    });
    
    

あなたの答え