如何正确使用redux-observable并承诺?

时间:2017-07-25 18:16:30

标签: javascript reactjs redux react-redux redux-observable

我正在使用hello.js登录。

hello('abc').login()会返回一个承诺。

它确实已成功登录,因为hello.js本身已将令牌保存在本地存储中。

但是,下面的代码有时不会发送操作SIGN_IN_SUCCEED

export const signInEpic = (action$, store) =>
  action$
    .ofType(SIGN_IN)
    .mergeMap(action =>
      Observable
        .fromPromise(hello('msft').login({ scope }))
        .map(response => ({
            type: SIGN_IN_SUCCEED,
            payload: response.authResponse.access_token
          })
        )
        .catch(error => Observable.of({ type: SIGN_IN_FAILED, payload: error }))
    );

更新: 周杰伦的暂停被捕异常方式帮我找到了错误。上面的代码没有问题。导致问题的原因是,首先我尝试在获取SIGN_IN_SUCCEED后将令牌保存到商店。然后我会在应用登录后立即使用令牌来获取内容。因此,当使用令牌获取步骤在在商店中保存令牌步骤之前运行时,会导致问题也不会发送SIGN_IN_SUCCEED

1 个答案:

答案 0 :(得分:2)

如果我对你的例子中缺少的东西做了一些假设(例如scope,hello.js做了什么等等)它按预期工作。这是一个例子:https://jsbin.com/rasumo/edit?js,output

遗憾的是,您的代码必定存在其他问题。你是如何确认它没有发送SIGN_IN_SUCCEED行动的?控制台中有错误吗?您是否尝试在调试器中启用“暂停捕获的异常”以查看您是否可能在某个地方无声地吞下错误,阻止操作到达您的Reducer?

要确认的另一件事是hello('msft').login({ scope })返回的Promise确实解决了。您可以链接.then()来确认这一点。

希望这有帮助!