在传奇中使用种族的优势

时间:2018-06-11 13:49:33

标签: javascript reactjs redux promise redux-saga

我的应用程序中有一个关于redux-saga的模式,对于asynchro调用我有两个函数 - 第一个是侦听某些指定的动作,第二个是调用api。

  1. 监听功能:

    function* userJoinListener() {
       while (true) {
          const { user } = yield take(UserJoinRequest);
    
          const promiseRace = yield race({
             res: call(userJoinFunction, user),
             err: take(UserJoinError),
          });
    
          if (promiseRace.res) {
            // code if success
          } else {
            // code if fail
          }
       }
    }
    
  2. Api呼叫执行功能:

    function* userJoinFunction(user) {
       try {
          return yield call(userJoin, user);
       } catch (err) {
          yield put(userJoinFail);
       }
    }
    
  3. 我的问题是:这里使用race有什么好处?说实话,我可以在与race相同的位置使用第二个函数,它会按预期工作:

    function* userJoinListener() {
       while (true) {
          const { user } = yield take(UserJoinRequest);
    
          try {
             // code if success
             return yield call(userJoin, user);
          } catch (err) {
             // code if fail
             yield put(userJoinFail);
          }
       }
    }
    

    谢谢:)

    相关问题Difference between Promise.race() and try/catch in redux-saga

    更新

    优点:

    • 取消请求的能力

1 个答案:

答案 0 :(得分:2)

确实在这里使用LibraryB是不必要的复杂。

如果您在被叫传奇(race)内部处理错误或取消,那么只需使用userJoinFunction / try..catch即可。

另一方面,如果从外部发生某些事情(超时,用户操作),你需要取消传奇,那么使用cancel效果是有意义的。