2017-09-28 8 views
0

は、私が持っていると言うこのjavascript関数の戻り値のベストプラクティス/大会

私は if文で chargeCreditCard()から「ERR」を表示したい場合は、一般的に行われている何
if (! chargeCreditCard()) { 
    // my custom error message here. 
    // would like to display 'err' from 
    // chargeCreditCard 
    render("Could not charge cc") 
} else { 
    render("thanks! will ship soon") 
} 

chargeCreditCard() { 
    Library.charge(cc_info, function(err, success) { 
     if (err) 
      return false 

     return true 
    } 
} 

chargeCreditCardtrueまたはfalseを返すので、私は基本的に "can not charge cc"というサーバをレンダリングします。

chargeCreditCard内部からreturn errをやって、その後

var result = chargeCreditCard 
if (result !== true) { 
    render(result) 
} else { 
    render('thanks! will ship soon') 
} 

ないコーディングの質問のようなものが、私が思うのデータ・フロー・質問を行うにする必要があります。

+0

私は一緒に行くだろう...どちらも。別の場所でエラーを処理し、エラーメッセージを次のルータ/アプリケーションのエラーハンドラに送信して、それを他のエラーと同様に処理します。これにより、集中した場所でそれぞれの発生を追跡することもできます。 –

答えて

0

この場合、より意味のあるオプションは、Promiseを返しています。

chargeCreditCard() 
    .then(_ => render("thanks! will ship soon")) 
    .catch(err => render(`Could not charge cc. Reason: ${err}`)); 

chargeCreditCard() { 
    return new Promise((resolve, reject) => 
    Library.charge(cc_info, err => err ? reject(err) : resolve()) 
); 
} 

コールバックパッシングは複雑な上、コードを作成する傾向があり、さらにあなたがチェーン化し、それらをネスト始めるとき:約束は、または成功しない場合があり、非同期操作をカプセル化するのに最適なツールです。残念ながら、約束は比較的新しいツールであり、NodeJS/Javascriptのオープンソースコードの大部分はコールバックの引き渡しに大きく依存しています。

0

私はこのようなものでいいと思う:

function chargeCreditCard(callback) { 
    Library.charge(cc_info, callback); 
} 

chargeCreditCard(function(err, success) { 
    if (success) { 
    render("thanks! will ship soon"); 

    } else { 
    var errorMsg = "Could not charge cc."; 

    if (err) 
     errorMsg += " Error: " + err; 

    render(errorMsg); 
    } 
}); 
+0

問題は、充電が成功した場合、私はもう少し事をします。顧客データをデータベースに保存したり、電子メールを送ったりするのと同じように、 'chargeCreditCard'機能を使わないようにしてください。 – sqram

+1

この場合、chargeCreditCard関数は' Library.charge'を呼び出すだけです。 – H77

+0

なぜdownvote? – H77