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

sta*_*lei 6 javascript promise reactjs redux react-redux

我正在尝试通过react redux 文档了解promises的中间件,但不理解then下面的部分:

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

  return Promise.resolve(action).then(store.dispatch)
}
Run Code Online (Sandbox Code Playgroud)

如何then知道要发送什么?这个动作没有作为一个参数传递过来

return Promise.resolve(action).then(function (action) {store.dispatch(action})
Run Code Online (Sandbox Code Playgroud)

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

jam*_*non 4

我希望我能帮助解释这个问题。

让我们看看您熟悉的内容:

return Promise.resolve(action)
    .then(function (action) { store.dispatch(action)} )
Run Code Online (Sandbox Code Playgroud)

你看到这部分:

function (action) { store.dispatch(action)} 
Run Code Online (Sandbox Code Playgroud)

这只是一个等待传递“action”属性的函数。

现在,当我们看看你的大脑遇到的问题是:

return Promise.resolve(action)
  .then(store.dispatch) // <--- this part
Run Code Online (Sandbox Code Playgroud)

“dispatch”只是一个函数,在本例中它需要一个参数。最有可能的是一个对象 - 像这样:

store.dispatch({ type: 'MY_ACTION_TYPE' })}
Run Code Online (Sandbox Code Playgroud)

现在,你“可以”将它包装在一个闭包中,就像这样,它看起来很熟悉:

.then( (action) => {
   store.dispatch(action)
})
Run Code Online (Sandbox Code Playgroud)

但是,我们真的需要将它“包装”在匿名函数中吗?不是真的,所以我们可以输入:store.dispatch,它是函数“等待”从承诺的返回中传递参数。可以这样想:

 var MultiplyByTwo = (x) => x * 2

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

当我们检查函数“MultipleByTwo”时——它具有您所知道的熟悉的签名: (x) => x * 2

如果我们只删除函数名称,则结果是一样的:

Promise.resolve(5).then((x) => x * 2)
Run Code Online (Sandbox Code Playgroud)

注意:您会看到resolve(5) --> 将resolve.then视为一条链,或“切换”。当我们“resolve(5)”时,我们将值“5”向前传递到“.then”。现在记住,5 值可以是任何东西......一个基元,在本例中是 5,一个对象 {TYPE: "WHATEVER"},一个函数等等......它只是放手......就像,“嘿 '.then',这就是我的价值……”

resolve(5).then(myfunction)
        |                ^
        |__>__>__>__>__>_|
Run Code Online (Sandbox Code Playgroud)

重要的是要理解“myFunction”是上面的这个例子,或者是我们的multiplyByTwo 甚至是store.dispatch 的例子。它们都期待一个传递的参数。

multiplyByTwo(x) <-- expecting one argument
Run Code Online (Sandbox Code Playgroud)

或者你的函数可能不会在函数签名中声明它,但它会在函数体内声明,阿拉..

myFunction() {
   const args = Array.from(arguments) // we grab the arguments
}
Run Code Online (Sandbox Code Playgroud)

或希望得到任意数量的论据

myOtherFunction(...args)
Run Code Online (Sandbox Code Playgroud)

但是,是的——这些职能正在等待决议的一些输入来采取行动。在某些情况下,您可能不关心返回值(如果有),您只想进行一些流量控制...执行此操作,“然后”执行该操作。

我希望这对您有所帮助,并且希望我确实回答了您的问题。如果没有,请告诉我。