2017-12-04 12 views
0

パラメータが見つからない場合(!a ||!b)と同じ関数(ここではA)でレスポンスとコールバックを記述すると、応答は送信されますが、親コンテキストはコールバックを受け取らないため、APIが壊れてメモリが無駄になります。同じ関数でコールバックとレスポンスを送信する

function practice (req, res){ 
    var a = req.body.a; 
    var b = req.body.b; 
    A(a,b, function(err, result){ 
     if(err){ 
      return err; 
     }else{ 
      return res.send(c + "Action cmplete"); 
     } 
    }) 
} 

function A(a,b, callback){ 
    if(!a || !b){ 
     return res.send("param missing"); 
    } 
    var c; 
    c = a+b; 
    return callback(null, c); 
} 
+0

なぜ、(if a ||!b)if(if a !|!b)の後にelseループを追加しないと、エラーのあるコールバックが返されます。 –

+0

はい、できますが、私のケースで何が起こるかを知りたい@RajkumarSomasundaram –

+0

Uの場合、Uは常に関数Aを1,2で呼び出す。したがって、あなたが取り組んでいるifループは私にとっては重複しているようです。あなたのparamが欠落している行にも追加してください。 –

答えて

0

callbackaと定義していないため、コード例が少し不完全なようです。

しかし、通常、非同期操作を実行してコールバックを受け入れる関数を設計する場合、非同期操作がエラーで完了したり正常に完了したときに、呼び出し元にフィードバックを提供することがほとんどです(おそらく戻り値を持つ)。それを行う唯一の方法は、操作が完了したときに常にコールバックを呼び出すことです。

もしそうでなければ、呼び出し側は、非同期操作がいつ行われたのか分からず、またいつも問題ではないということを知りません。したがって、コールバックを介して通知する汎用非同期APIは、非同期操作が完了したときに常にコールバックを呼び出す必要があります。

発信者の視点から考えてみましょう。呼び出し元は、関数呼び出し後に何を確認するかを知る必要があります。彼らの人生をシンプルで一貫したものにしたいと思っています。すべてをチェックする場合は、同期戻り値、同期例外をチェックし、コールバックが呼び出されたかどうかをチェックする必要があります。それはすべてのことを必要とするAPIの悪夢です。これらのメカニズムのうちの1つだけを一貫して使用するAPIが本当に必要です。したがって、コールバック経由で通知する場合は、コールバックを介して常に通知し、他の2つのメカニズムを使用しないでください。

これは、非同期操作の管理がより簡単になる可能性があるためです。ちょうどあなたの関数から約束を返すと、呼び出し元は常に約束の上に.then().catch()を使用できます。あなたの内部機能は、その約束を解決するか拒否します。一方


あなたはその契約、呼び出し元の関数を設計する場合、これらの条件の下で、私はいくつかの他のコードを実行しようとコールバックを呼び出し、これらの他の条件I下にいないよさ、ということ他のコードを実行せず、代わりにコールバックを呼び出すこともできます。これは非常に一貫したインターフェイスではなく、あなたがやっていることにあまり慣れていない発信者にとってあまり親切ではありませんが、あなたはそれを行うことができます。

矛盾があるため、よく知られているAPIのようなインターフェイスが表示されるのは間違いです。しかし、あなたが本当に欲しがっているのであれば、あなた自身のためにそれを行うことができます。私はそれをベストプラクティスとは考えていません。

+0

説明をお寄せいただきありがとうございます。コールバックの部分を編集しました。@ jfriend00 –

関連する問題