2017-01-28 7 views
0

コールバック関数にパラメータを渡す場合があります。たとえば、同じ機能を指し示す2つのルートがあります。複数のものを指定するルートでは、複数のものを削除することができます。バインドを使用してコールバック関数のパラメータを渡す順序を指定します。

server.app.delete('/api/delete/sku', this.deleteSku); 
server.app.delete('/api/delete/skus', this.deleteSku); 

deleteSku(req, res, allowMultiple = false) { 
    //... delete code here ... 
} 

私がこの

server.app.delete('/api/delete/sku', this.deleteSku); 
server.app.delete('/api/delete/skus', _.bind(this.deleteSku, _, _, true)); 

のようなアンダースコアとlodashで行うことができます知っている。しかし、これは私には醜いと感じ、私はそれは、人々が慣れていない場合は特に、コードの読みやすさに影響を考えますアンダースコアで

また、ネイティブバインドで引数を指定することもできますが、引数は関数の前に置くこともできます。

server.app.delete('/api/delete/sku', this.deleteSku); 
server.app.delete('/api/delete/skus', this.deleteSku.bind(null, true)); 

deleteSku (allowMultiple = false, req, res) { } 

今それだけでallowMultiple最初に処理するためにdeleteSkuを書き換えるために奇妙な感じ、私は特異なルートの場合にバインドをしない場合はそれが壊れます。

もう1つの方法は、deleteSkudeleteSkusの両方のメソッドを本質的に同じことをするが、異なるルートにマップすることです。私はコードが少なくて良い解決法があると思っていました。

+0

よく '.bind()'はそれを行います。あなたはそれをそのまま使用するか、あるいは別の場所にargsを置く何かを使うことができます。あるいは、適切な場所にあるargsを使って実際の関数を呼び出すスタブ関数を宣言することもできます。私はあなたがここに来ることをあなたが期待しているのかどうかは分かりません。あなたは '.bind()'が何をしているか知っているようで、他のオプションがあることを知っているようです。はい、アンダースコア/ロダッシュのものは醜いものであり、多くの人には分かりません。 – jfriend00

+0

個人的には、私はたぶんスタブ関数を使用するだけです: 'server.app.delete( '/ api/delete/skus'、(req、res)=> this.deleteSku(req、res、true));'それは読みやすさのためにそれを打つのは難しいです。 – jfriend00

+0

Expressで非常に注意してください。'(req、res、next)'を渡してハンドラにあなたのデフォルト引数を本当に混乱させることがある場合があります。 – jfriend00

答えて

0

.bind()は、最初に追加のargsのみをバインドします。私は、最初はあなたのallowMultiple引数が必要な場所ではないとあなたに同意します。だから、.bind()は本当にあなたのために正しいことをしません。引数の前に付ける代わりに、.bind()のように、Javascriptに組み込まれているオプションはありません。

Expressがコールバック(req, res, next)に3番目の引数を渡すときに私が完全にはわからないので、ルートハンドラを使っているようなデフォルトの引数を使用することに非常に注意します。 Expressがその3番目の引数を渡し、ルートハンドラthis.deleteSkuが、それが渡されたallowMultiple引数として誤って解釈される可能性が高いようです。そのため、私はあなたがこれを行うことをお勧めしたい:

server.app.delete('/api/delete/sku', (req, res) => this.deleteSku(req, res, false)); 
server.app.delete('/api/delete/skus', (req, res) => this.deleteSku(req, res, true)); 

その後、あなたはすべてのボックスをチェック:

  1. それはまだだ1行のコード。
  2. それは完全に明確な、それはやっているものを読めるのです
  3. それは、任意のサードパーティのライブラリ
  4. に依存していないそれはあなたのハンドラと紛らわしいものにnext引数を渡すExpressから完全に安全です。
+0

@ SimonLau-Yamauchi - これはあなたの質問に答えましたか?その場合は、回答の左側にある緑色のチェックマークをチェックして、コミュニティにその旨を明記してください(また、ここで適切な手順を実行するための評判ポイントを獲得してください)。そうでない場合、あなたはまだ混乱していることについてこの答えの下にコメントを残してください。 – jfriend00

関連する問題