2016-08-30 6 views
6

私はReduxの反応docsを通じて約束のためのミドルウェアについて学ぶためにしようとしているが、下のthen部分を理解していない:どのように反応すると約束ミドルウェアは、結果のアクションをディスパッチに送信しますか?

const vanillaPromise = store => next => action => { 
    if (typeof action.then !== 'function') { 
    return next(action) 
    } 

    return Promise.resolve(action).then(store.dispatch) 
} 

どうthenを派遣するものを知っていますか?アクションは引数として渡されませんでした

return Promise.resolve(action).then(function (action) {store.dispatch(action}) 

このように、アクションはディスパッチがアクションを受け取る方法はわかりません。

答えて

4

私はこの説明で助けてくれることを願っています。

return Promise.resolve(action) 
    .then(function (action) { store.dispatch(action)}) 

あなたはこの部分を参照してください:

function (action) { store.dispatch(action)} 

「アクション」プロパティを渡されるのを待っているだけの機能です

は、あなたが精通しているものを見てみましょう。今

、私たちはあなたの周りのあなたの脳を包むの問題を持っているものを見て、このです:

return Promise.resolve(action) 
    .then(store.dispatch) // <--- this part 

「派遣」は単なる関数であり、それは、この場合には、引数を期待しています。オブジェクト、最も可能性が高い - そうのように:今

store.dispatch({ type: 'MY_ACTION_TYPE' })} 

、あなたはそうのように、クロージャでラップ「でした」、そしてそれがおなじみになります。

.then((action) => { 
    store.dispatch(action) 
}) 

しかし、私たちは本当に必要なのですかそれを無名関数で「ラップ」するには?実際はそうではありません:store.dispatchを置くことができます。それは、約束を返すことから引数を渡すための関数「待機」です。このようにそれを考える:

我々は機能を調べる際に "MultipleByTwoを" - それはおなじみの署名は、あなたが知っていることがあります。 (X)=> X * 2

我々場合

Promise.resolve(5).then((x) => x * 2) 

注:ただ、その同じことを関数名を削除します(5)その解決を参照してください - >チェーン、または「ハンドオフ」としてそのresolve.then考えます。 「解決する(5)」ときには、その値「5」を「.then」に渡します。 5値は何でもかまいません...プリミティブ、この場合は5つのオブジェクト{TYPE: "WHATEVER"}、関数など...それは単に手を離します。ここに私の値は「

resolve(5).then(myfunction) 
     |    ^
     |__>__>__>__>__>_| 

はあることを理解することは重要である 『彼らはALL(渡す引数を期待している... .... MyFunctionを』は、この例の上または当社multiplyByTwo、あるいはそのstore.dispatch例であるありますs)。

multiplyByTwo(x) <-- expecting one argument 

たり、関数が関数のシグネチャ以内にそれを宣言しないかもしれないが、それは意志体、ALAの内部..

myFunction() { 
    const args = Array.from(arguments) // we grab the arguments 
} 

または引数

myOtherFunction(...args) 

しかし、はい、任意の数を期待 - それらの機能がオンに行動する決議からいくつかの入力を期待しています。返り値が気にならない場合があります。フロー制御をしたいだけの場合は、「THEN」と入力します。

私はそれが役に立ちましたと願っています。実際にあなたの質問に答えました。そうでない場合は、私に知らせてください。

+0

ありがとうございます、私はそれがクロージャが動作することを必要としていないことがわかります。これが何であるかに基づいていますか?特定の引数がパラメータとして宣言されずに渡されるというjavascriptルールは何ですか?それは何ですか?それを呼び出すオブジェクトの解決された値を魔法のようにとり、コールバックに挿入します。 – stackjlei

+0

はい、「.then」がどのように機能するかを説明する私の答えを更新しましょう。 –

関連する問題