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の呼び出しは実行されません。
あなたは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]
コメントを追加