【问题标题】:How does react redux promise middleware send the resulting action to the dispatch?react redux Promise 中间件是如何将结果动作发送到 dispatch 的?
【发布时间】:2017-01-06 05:48:21
【问题描述】:

我正在尝试通过 react 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})

所以我不明白 dispatch 如何接收动作。

【问题讨论】:

    标签: javascript reactjs promise redux react-redux


    【解决方案1】:

    我希望我能帮忙解释一下。

    让我们看看你所熟悉的:

    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)
    

    但是是的——这些函数期望从决议中得到一些输入来采取行动。在某些情况下,您可能不关心返回值,如果有的话,您只是想进行一些流程控制......这样做,“然后”那个......

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

    【讨论】:

    • 谢谢,我可以看到它必须不需要关闭才能工作。但基于这是什么工作?什么是说特定参数被传入而不被声明为参数的javascript规则?这是#then 所做的吗?它神奇地将调用它的对象的解析值插入到它的回调中?
    • 是的,让我更新我的答案,解释“.then”的工作原理。
    猜你喜欢
    • 1970-01-01
    • 2017-06-12
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多