我希望我能帮忙解释一下。
让我们看看你所熟悉的:
return Promise.resolve(action)
.then(function (action) { store.dispatch(action)} )
你看这部分:
function (action) { store.dispatch(action)}
这只是一个等待传递“action”属性的函数。
现在,当我们查看您遇到的问题时,您的大脑是这样的:
return Promise.resolve(action)
.then(store.dispatch) // <--- this part
“dispatch”只是一个函数,在这种情况下,它需要一个参数。最有可能的是一个对象 - 像这样:
store.dispatch({ type: 'MY_ACTION_TYPE' })}
现在,你“可以”将它包裹在一个闭包中,就像这样,它看起来很熟悉:
.then( (action) => {
store.dispatch(action)
})
但是,我们真的需要将它“包装”在一个匿名函数中吗?不是真的,所以我们可以放:store.dispatch,它是函数“等待”从promise的返回中传递参数。可以这样想:
var MultiplyByTwo = (x) => x * 2
Promise.resolve(5).then(MultiplyByTwo)
// see here, this function is gonna be called with the resolution with the 5
当我们检查函数“MultipleByTwo”时——
它有你所知道的熟悉的签名:
(x) => x * 2
如果我们只是去掉函数名,也是一样的:
Promise.resolve(5).then((x) => x * 2)
注意:您看到 resolve(5) --> 将 resolve.then 视为一个链或“移交”。当我们“resolve(5)”时,我们将该值“5”向前传递到“.then”。现在请记住,5 值可以是任何东西......一个原始值,在这种情况下为 5,一个对象 {TYPE:“WHATEVER”},一个函数等等......它只是放手......就像,“嘿'.then',这是我的价值……”
resolve(5).then(myfunction)
| ^
|__>__>__>__>__>_|
重要的是要理解“myFunction”是上面的这个例子,或者在我们的 multiplyByTwo 甚至那个 store.dispatch 例子中。他们都期待一个传递参数。
multiplyByTwo(x) <-- expecting one argument
或者您的函数可能不会在函数签名中声明它,但它会在主体中声明,唉..
myFunction() {
const args = Array.from(arguments) // we grab the arguments
}
或希望有任意数量的参数
myOtherFunction(...args)
但是是的——这些函数期望从决议中得到一些输入来采取行动。在某些情况下,您可能不关心返回值,如果有的话,您只是想进行一些流程控制......这样做,“然后”那个......
我希望这对您有所帮助,我希望我确实回答了您的问题。如果没有,请告诉我。