3


0

プロセスの途中でユーザーに確認を求める

ユーザーがそのアクションの特定の部分を実行することを確認するまで、アクション(関数/メソッド呼び出し)を一時停止するための良い方法を探しています。 コードの実行を停止できない環境でこれを行う必要があります(私の場合はActionScriptですが、JavaScriptのアプローチは同じである必要があります)。

説明のために、これはユーザープロンプトを導入する前のアクションのモックアップです。

 // this contains data needed by all the following phases //

 // this will be always be executed //

 // this will always execute too, if in this form, but in some cases we need to ask the user if he wants to do it //

 // also mandatory //
 +
 +
必要なのは、条件付きユーザープロンプト、「この部分を実行しますか?」、および「ユーザーが必要な場合にのみ」を挿入することです。
if( and not ){

}
else{

}
 +
 +
ActionScript / JavaScriptでこれを実行しようとすると、次のようなものが得られました。
if(){
    askForConfirmation(callback = function(){
        if()


    });
    return;
}

これで、「」と「」の両方が複製されます。 また、「」で作成されたオブジェクトを使用するため、すべてのデータをそれらの関数に渡すことなく、それらを外部関数に移動することはできません。

+

私の現在の解決策は、確認を求める前に宣言されたいくつかのローカル関数で をそれぞれ囲み( ``のデータにアクセスできるようにする)、コードを複製する代わりにそれらの関数を呼び出しますが、コードが実行された順番になっていないとは思えません。

何をお勧めしますか?

注:1。 「askForConfirmation」は非ブロッキング関数です。 これは、その呼び出しに続くコードがすぐに実行されることを意味します(これが、私のアプローチに「リターン;」がある理由です)。

4 Answer


3


注:正確な状況を確実に把握できるとは限りません。

ここでは、コマンドパターンが適している場合があります。 それは人々が提案しているものに似ています。

順番に実行されるコマンドの配列があります。

[, , , ]

コマンドを一度に1つずつ配列からシフトし、executeメソッドを呼び出すだけです。

オプションフェーズでは、ユーザーの確認が必要かどうかを確認し、そうでない場合はコマンド完了イベントをディスパッチするオプションのコードメソッドを実行し、必要な場合はアラートを表示し、イベントを待ち、結果を確認します。コマンド完了イベントをディスパッチするか、オプションのメソッドを呼び出します(実行してからコマンド完了をディスパッチします)。

また、コマンドのツリーを作成して、配列を台無しにすることなく実行の流れを明確に述べることができます。

これが、インストールウィザードなどのプログラムの仕組みです。

実行の順序がわかりやすく、コードが適切にチャンクに分割され、各ステップの複雑さがカプセル化されるという点で優れています。 たとえば、optional-phaseは終了フェーズについて何も知りません。 optional-phaseは、実行前にユーザーにプロンプ​​トが必要な場合があることのみを認識し、そのすべてを内部で処理します。

_ 「コマンドオブジェクトを使用すると、選択時にメソッド呼び出しを委任、シーケンス、または実行する必要がある一般的なコンポーネントを簡単に構築できます…​」 _


1


「コードは実行された順番になっていない」というのは、実際には私には問題ないようです。 明確である限り、実行された順序で記述されていないコードがあれば問題ありません。 実際、コードは可変の順序で実行されるため、コードを複製せずに実行する順序でコードを記述することは不可能だと思います。これは非常に大きな悪です。 適切な関数名を選ぶと、あなたのアプローチは私のコードレビューに合格します。

var optional_phase = function() {

}

var ending_phase = function() {

}

if(){
    askForConfirmation(function(){
        if()
            optional_phase();
        ending_phase();
    });
    return;
}

optional_phase();
ending_phase();


0


これはあなたが求めていることをしますか?

if(){
    askForConfirmation(function(){
        if()


    });
} else {


}


0


大きな変更ではありませんが、このフローが機能する場合、オプションのフェーズは繰り返されません

if(){
    askForConfirmation(function(){
      if()
      {

        return;
      }
  });
}