2017-02-23 5 views
0

私は以下のクラスを持っていますが、ここでバインドするのは混乱しています。クラスにはコンストラクタとsuper()がありません。なぜsetAllメソッドでバインドする必要がありますか?私はこのバインドを削除し、アプリケーションはまだ動作し、エラーはありません。バインドコンストラクタがない場合、これはクラスではオプションですか?

class PushScheduleActions { 

    /** 
    * Request all API 
    */ 
    fetchAll(params) { 
     return dispatch => { 
      dispatch(params); 

      PushScheduleApi.getAll(params) 
       .then(this.setAll.bind(this));//why use bind this here? 
       .catch(this.setError.bind(this)); 
     } 
    } 

    setAll(data) { 
     return data; 
    } 
} 

答えて

0

クラスのコンストラクタとスーパーを(持っていない)

これは完全に無関係です。

なぜsetAllメソッドでバインドする必要がありますか?

this

fetchAll内側を指すものに(PushScheduleActionsの可能性が高いインスタンス)を参照する必要があり、それはthisthis

  • を使用

    • 場合メソッドは、結合する必要があります。

    setAllthisを参照していないので、結合する理由はない。

    でも、setAllの方法は不要です。コードは.then(this.setAll.bind(this))なしでまったく同じように動作します。それでPushScheduleActionsサブクラスとし、子クラスはsetAllを上書きすると考えられます。さて、子クラス 'setAllthisを使用し、インスタンスを参照すると考えられます。親クラス(PushScheduleActions)はそれを知ることができないので、の子クラス実装がthisを使用するかどうかにかかわらず確実に動作するので、メソッドをバインドする方が安全です。

  • 0

    バインド()関数は、新しいバインド機能(BF)を作成します。 BFは元の関数オブジェクトをラップするエキゾチック関数オブジェクト(ECMAScript 2015)です。一般にBFを呼び出すと、ラップされた関数が実行されます。詳細については

    私はそれはあなたにバインド(に理解するために大いに役立つことを願っています。このリンクをたどる)方法 Use of the JavaScript 'bind' method

    +0

    何が必要ですか?それは上のケースでそれなしで働いた。私はバインドの使用が何であるかを知っています。なぜ私の場合になぜそれがなぜ必要なのか具体的に質問しています。 –

    +0

    bind()は特定のオブジェクトに "this"の値を設定できるため、メソッドを再利用して関数をカリングするために使用されるbind()メソッドです。これは、「これ」が意図されていないことがあるため、非常に役立ちます。 – Sateesh

    1

    コンストラクタ、スーパーとバインドの間には関係がありません。

    バインドは何ですか? コンテキストユーザーが渡された新しい関数を返します。

    あなたの場合、pushScheduleApiの成功例では、bindメソッドによって返される新しいsetAll関数を渡しています。

    1. あなたのsetAll関数はコンテキストを使用しないため、コンテキストを渡す必要はありません。

    2. ディスパッチは矢印関数なので、コンテキストは継承されます。だから、バインド方法は必要ありません。あなたは単にthis.setAllを使用することができます

    関連する問題