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)
所以我不明白派遣是如何收到行动的.
我希望我能帮助解释这个问题。
让我们看看您熟悉的内容:
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)
但是,是的——这些职能正在等待决议的一些输入来采取行动。在某些情况下,您可能不关心返回值(如果有),您只想进行一些流量控制...执行此操作,“然后”执行该操作。
我希望这对您有所帮助,并且希望我确实回答了您的问题。如果没有,请告诉我。
| 归档时间: |
|
| 查看次数: |
999 次 |
| 最近记录: |