5

プログラマーは、エラーについて非同期的に通知を受け取る方法について意見が分かれているようです。

一部のプログラマーは、値と、値が間違っていないかどうかを示すブール値の 2 つの引数を持つコールバックを使用することを好みます。try catchこれには、ステートメントのように見えるという利点があります。

asyncFunct(function (value, noError) {
    if (noError) {
        // success, do something with value
    } else {
        // value is the error which is thrown
    }
});

他の人は負を好みます (つまり、ブール値は値が間違っているかどうかを伝える必要があります)。彼らの理由は、非同期関数が決してエラーをスローしないことがわかっている場合は、次のように 2 番目のパラメーターを安全に省略できるということです。

asyncFunction(function (value, isErroneous) {
    if (!isErrorneous) {
        // success, do something with value
    } else {
        // value is the error which is thrown
    }
});

asyncFunction(function (value) {
    // success, do something with value
});

次に、非同期関数の正常な実行に対して個別のコールバックを提案し、非同期関数の誤った実行に対してエラーバックを提案する人々がいます。これにより、プログラマーは、コールバック、エラーバック、両方を処理するか、または何も処理しないかを選択できます。

asyncFunction(function (value) {
    // success, do something with value
}, function (error) {
    // handle the error
});

asyncFunction(function (value) {
    // success, do something with value
});

asyncFunction(null, function (error) {
    // handle the error
});

どちらの方法を好むかを尋ねているわけではありません。どの方法をいつ使用すればよいかがわかるように、各方法の長所と短所を尋ねているだけです。

4

1 に答える 1

1

設計上の決定:

これは単なる設計上の決定であり、それ以上のものではありません。スタンドアロンのパラメーターの場合は、スタンドアロンの関数を使用して、「より美しい」コードを作成できます (誰かにとっては - 誰かにとってはもっと面倒です - 本当に主観的です)。

エラーの複雑さ:

一部のアプリケーションでは、より複雑なエラーが発生するfilesystem.fileRead可能性があり (FILE_DONT_EXISTS、FILE_LOCKED、NOT_PERMISSIONS .. が発生する可能性があります)、一部のアプリでは単にエラーをスローする必要があります (db.checkConnectionまたはdb.openConnection)。

順序と違い:

優れた API の非常に優れたサンプルが Amazon から提供されています。確認できます。http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html

応答:コールバック関数のような非同期関数copyObject(params = {}, callback)では、常に 2 つのパラメーターがあります:err (Error)data (Object)in function(err, data) { ... }。エラーがある場合、データがないため、エラーは最初のパラメーターのように設計されています。つまり、優先順位と順序についてです。

// request

getObject({
   param1 : something,
   param2 : something,
   param3 : something
}, callback);

// response

function callback(error, response){
   if error throw err;
   // now deal with responsei
}

ご覧のとおり、両方とも 2 つの方法が混在しています。リクエストではオブジェクトと関数を渡し、応答ではエラーとオブジェクトを(そのリクエスト関数に)取得します。

于 2014-01-16T09:47:59.400 に答える