コールバックを使用して関数を複数回連続して呼び出すと、コールバック地獄が発生します

マーカス

TCP / IPソケットを介してサーバーと通信するために使用される関数があります。サーバーにコマンドを書き込むたびに、応答を待つ必要があります。私は正常に動作し、次のように簡略化された関数を作成しました。

function sendCommand(command, callback)
{
    // send command and wait for server to respond...
    // if response was ok
    callback(response, null);
    // if response was bad
    callback("", error);
}

これに伴う問題は、一連のコマンドをサーバーに送信したいということです。答えに応じて、次のコマンドに進むか、エラーを処理してそれ以上コマンドを送信しないようにします。

現在、私はこの関数を次のように使用しています。

sendCommand("first command to server", function(response, error)
{
    if(error)
    {
        // handle error
    }
    else
    {
        sendCommand("second command to server", function(response, error)
        {
            //etc..
        }
    }
}

多くの順次呼び出しを行う場合、これはコールバック地獄になります。エラーを受け取った場合に中断する条件付きコールチェーンを作成する方法はありますか?何かのようなもの:

sendCommand("command1", function(){})
.sendCommand("command2", function(){})
.sendCommand("command3", function(){})
.sendCommand("command4", function(){});

また、たとえば、command2がエラーを受け取った場合、command3およびcommand4の呼び出しは実行されません。

Arg0n

あなたはPromises使用する代わりに見てみたいと思うかもしれませんcallbacks

function sendCommand(command) {
  return new Promise(function(resolve, reject) {
    if(Math.random() > 0.6) {
      reject("Command " + command + " failed.");
    } else {
      resolve("Command " + command + " succeeded");
    }
  });
}

sendCommand("command1")
.then(function(data) {
  console.log(data); //Data from command1
  return sendCommand("command2");
})
.then(function(data) {
  console.log(data); //Data from command2
  return sendCommand("command3");
})
.then(function(data) {
  console.log(data); //Data from command3
  return sendCommand("command4");
})
.then(function(data) {
  console.log(data); //Data from command4
})
.catch(function(error) {
  console.log(error); //Error from any command
});

フィドル

更新1

失敗した例に応じて異なる処理エラー:

function sendCommand(command) {
  return new Promise(function(resolve, reject) {
    if(Math.random() > 0.6) {
      reject({ command: command, msg: "Command " + command + " failed."});
    } else {
      resolve("Command " + command + " succeeded");
    }
  });
}

sendCommand("command1")
.then(function(data) {
  console.log(data); //Data from command1
  return sendCommand("command2");
})
.then(function(data) {
  console.log(data); //Data from command2
  return sendCommand("command3");
})
.then(function(data) {
  console.log(data); //Data from command3
  return sendCommand("command4");
})
.then(function(data) {
  console.log(data); //Data from command4
})
.catch(function(error) {
  switch(error.command) {
    case "command1":
      //Handle command1 error
      break;
    case "command2":
      //Handle command1 error
      break;
    case "command3":
      //Handle command1 error
      break;
    case "command4":
      //Handle command1 error
      break;
  }
  console.log(error.msg); //Error message from any command
});

フィドル

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ServiceNow:コールバック関数でonSubmitを呼び出すと、無限ループが発生します

分類Dev

関数呼び出し後にAjaxコールバックが発生しています

分類Dev

引数を使用してコールバック関数を呼び出す方法

分類Dev

mockitoでコールバックを使用して連続した呼び出しをスタブする方法

分類Dev

RxJavaを使用してこのコールバック地獄を回避する方法

分類Dev

OkHttpを使用して複数の非同期リクエストを呼び出すと、コールバックが妨害されることがあります

分類Dev

すべての関数が完了したときにのみコールバックを呼び出す方法

分類Dev

C ++ Boost関数のコールバック。関数をコールバックとして呼び出し、内部にパラメーターを渡す方法は?

分類Dev

単純なAJAXWebMethodを呼び出すと、常に「失敗」のコールバックが発生します

分類Dev

QML から複数の C++ 関数を呼び出し、最初の関数に接続呼び出しが含まれている場合、コールバックがトリガーされる前に QML が続行されます。

分類Dev

別のモジュール関数をコールバックとして呼び出す[ES6]

分類Dev

2つのコールバックを使用して関数呼び出しをpromiseに変換する方法

分類Dev

JavaScript でコールバック引数を呼び出しているときにエラーが発生する

分類Dev

不明な数のパラメーターを使用してコールバックを呼び出します

分類Dev

AJAX呼び出しへのコールバックとしてobjectsメソッドを使用します

分類Dev

AJAX呼び出しへのコールバックとしてobjectsメソッドを使用します

分類Dev

Javaでパラメータとしてコールバックを取る関数を呼び出す方法

分類Dev

TypeScriptを使用してサービスがAngularJsでコールバックをトリガーしたときに呼び出されるコールバック関数をサービスに登録します

分類Dev

Javascript:関数は、これまでに呼び出したすべての関数のすべてのコールバックを呼び出しますか?

分類Dev

IDとキーを含む関数を呼び出すためにバックティックを使用しようとしています。しかし、予期しないトークンとしてエラーが発生します

分類Dev

C#で行うようにJavaでコールバックを使用して関数を呼び出す方法

分類Dev

これを使用してコールバックで他の関数を呼び出す

分類Dev

非同期を使用して再帰関数を実行すると、コールバックでエラーが発生します

分類Dev

AngularJSはコールバック関数を呼び出します

分類Dev

電子を使用した複数のコールバック関数で値を返すときにエラーが発生しました

分類Dev

BLoC:複数回呼び出されたコールバックをリッスンします

分類Dev

Javascript-コールバックとして使用される無名関数は複数回作成されますか?

分類Dev

pybind11を使用してC ++スレッド内のコールバックとしてPython関数を呼び出す方法

分類Dev

System.Threading.Timerがコールバック関数の暗黙の複製を呼び出していますか?

Related 関連記事

  1. 1

    ServiceNow:コールバック関数でonSubmitを呼び出すと、無限ループが発生します

  2. 2

    関数呼び出し後にAjaxコールバックが発生しています

  3. 3

    引数を使用してコールバック関数を呼び出す方法

  4. 4

    mockitoでコールバックを使用して連続した呼び出しをスタブする方法

  5. 5

    RxJavaを使用してこのコールバック地獄を回避する方法

  6. 6

    OkHttpを使用して複数の非同期リクエストを呼び出すと、コールバックが妨害されることがあります

  7. 7

    すべての関数が完了したときにのみコールバックを呼び出す方法

  8. 8

    C ++ Boost関数のコールバック。関数をコールバックとして呼び出し、内部にパラメーターを渡す方法は?

  9. 9

    単純なAJAXWebMethodを呼び出すと、常に「失敗」のコールバックが発生します

  10. 10

    QML から複数の C++ 関数を呼び出し、最初の関数に接続呼び出しが含まれている場合、コールバックがトリガーされる前に QML が続行されます。

  11. 11

    別のモジュール関数をコールバックとして呼び出す[ES6]

  12. 12

    2つのコールバックを使用して関数呼び出しをpromiseに変換する方法

  13. 13

    JavaScript でコールバック引数を呼び出しているときにエラーが発生する

  14. 14

    不明な数のパラメーターを使用してコールバックを呼び出します

  15. 15

    AJAX呼び出しへのコールバックとしてobjectsメソッドを使用します

  16. 16

    AJAX呼び出しへのコールバックとしてobjectsメソッドを使用します

  17. 17

    Javaでパラメータとしてコールバックを取る関数を呼び出す方法

  18. 18

    TypeScriptを使用してサービスがAngularJsでコールバックをトリガーしたときに呼び出されるコールバック関数をサービスに登録します

  19. 19

    Javascript:関数は、これまでに呼び出したすべての関数のすべてのコールバックを呼び出しますか?

  20. 20

    IDとキーを含む関数を呼び出すためにバックティックを使用しようとしています。しかし、予期しないトークンとしてエラーが発生します

  21. 21

    C#で行うようにJavaでコールバックを使用して関数を呼び出す方法

  22. 22

    これを使用してコールバックで他の関数を呼び出す

  23. 23

    非同期を使用して再帰関数を実行すると、コールバックでエラーが発生します

  24. 24

    AngularJSはコールバック関数を呼び出します

  25. 25

    電子を使用した複数のコールバック関数で値を返すときにエラーが発生しました

  26. 26

    BLoC:複数回呼び出されたコールバックをリッスンします

  27. 27

    Javascript-コールバックとして使用される無名関数は複数回作成されますか?

  28. 28

    pybind11を使用してC ++スレッド内のコールバックとしてPython関数を呼び出す方法

  29. 29

    System.Threading.Timerがコールバック関数の暗黙の複製を呼び出していますか?

ホットタグ

アーカイブ