react redux承诺中间件如何将结果操作发送给调度?

时间:2016-08-30 05:03:05

标签: javascript reactjs promise redux react-redux

我正在尝试通过react redux docs了解promises的中间件,但不理解下面的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})

所以我不明白派遣是如何收到行动的。

1 个答案:

答案 0 :(得分: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

&#34;发送&#34;只是一个函数,在这种情况下,它期望一个参数。最有可能的是,一个对象 - 就像这样:

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

现在,你&#34;可能&#34;将它包装在一个封闭物中,就像这样,看起来很熟悉:

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

但是,我们真的需要&#34;包装&#34;它在一个匿名函数?不是真的,所以我们可以放:store.dispatch,它是功能&#34;等待&#34;从承诺的回归中传递出来的论点。想到这样:

 var MultiplyByTwo = (x) => x * 2

 Promise.resolve(5).then(MultiplyByTwo) 
// see here, this function is gonna be called with the resolution with the 5

当我们检查函数&#34; MultipleByTwo&#34; - 它有你熟悉的熟悉签名: (x)=&gt; x * 2

如果我们只删除函数名,那就是同样的事情:

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

注意:您会看到解决方案(5) - &gt;想到那个决心。然后作为一个链条,或者一个&#34;切换&#34;。当我们解决(5)&#34;时,我们正在传递这个价值&#34; 5&#34;继续进入&#34;。然后&#34;。现在记住,5个值可以是任何东西......一个原语,在这种情况下是5,一个对象{TYPE:&#34; WHATEVER&#34;},一个函数等......它只是放手..喜欢,&# 34,嘿&#39;。然后,这是我的价值......&#34;

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

重要的是要理解&#34; myFunction&#34;就是上面这个例子,或者是我们的multiplyByTwo,甚至是store.dispatch例子......他们都期待传递参数。

multiplyByTwo(x) <-- expecting one argument

或者你的函数可能没有在函数签名中声明它但它会在体内,ala ..

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

或希望获得任意数量的论点

myOtherFunction(...args)

但是 - 是的 - 这些功能期待决议的一些输入作用。可能有些情况下你并不关心返回的值,如果有的话,你只想要一些流量控制......这样做,&#34;那么&#34;该..

我希望这很有帮助,我希望我真的回答了你的问题。如果没有,请告诉我。