Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 响应逻辑应该发生在哪里,在传奇中还是在减速器中?_Javascript_Reactjs_Redux_Redux Saga - Fatal编程技术网

Javascript 响应逻辑应该发生在哪里,在传奇中还是在减速器中?

Javascript 响应逻辑应该发生在哪里,在传奇中还是在减速器中?,javascript,reactjs,redux,redux-saga,Javascript,Reactjs,Redux,Redux Saga,假设我有一个故事看起来是这样的: export function* incrementAsync(action) { try { const res = yield call(Api.signin.create, action.payload); yield put({ type: USER_SIGN_IN_FETCH_SUCCESS, payload: res.data.auth }; } catch (e) { yield p

假设我有一个故事看起来是这样的:

export function* incrementAsync(action) {
  try {
    const res = yield call(Api.signin.create, action.payload);
    yield put({ 
      type: USER_SIGN_IN_FETCH_SUCCESS,
      payload: res.data.auth
    };
  } catch (e) {
    yield put({ type: USER_SIGN_IN_FETCH_ERROR_NETWORK });
  }
}
fech是成功的,但这并不意味着用户实际登录:

res.data.auth.error
可能为真

我的问题是我是否应该这样做:

if (//user was succesfully logged in)
    yield put(//user was successfully logged in)
else if //wrong username
    yield put(//wrong username)
else if //wrong password
    yield put(//wrong password)

或者我应该只有一个表示成功,一个表示错误,并且在reducer中分析逻辑并构建与响应数据相关的存储?

我总是将尽可能多的逻辑移到reducer中。 逻辑在开发工具中更为明显,如果您在传奇中这样做,它可能会更难。 它也更容易测试,因为它是一个同步的纯函数。
另外,
USER\u SIGN\u IN\u FETCH\u SUCCESS
对于从saga发送到reducer的操作(从组件到reducer的操作应该不那么技术性)。

错误逻辑应该始终在
sagas
中处理。 在这种特殊情况下,您的API没有抛出正确的错误,因为如果您的API调用不是
成功
200
),那么该逻辑应该在catch语句中处理

为什么这里没有处理这个错误? 如果您使用的是
axios
,则这可能是由于API设计不当造成的(即登录错误返回200而不是400)。 如果只是手工操作,那么应该在
sagas
中的
catch
中抛出一个错误并处理该逻辑

所以我的建议是:

  • 向sagas抛出一个错误,以在
    catch
    语句中处理错误逻辑
  • 如果为了以编程方式抛出错误而必须解析响应,那么可以在API层进行解析

  • 执行特定操作以处理注册错误,或者只执行一般失败操作并向其传递错误消息(然后将其存储在redux以显示)

它应该看起来像:

export function* incrementAsync(action) {
  try {
    const res = yield call(Api.signin.create, action.payload);
    yield put({ 
      type: USER_SIGN_IN_FETCH_SUCCESS,
      payload: res.data.auth
    };
  } catch (error) {
    yield put({ type: USER_SIGN_IN_FAIL, payload: error.message });
  }
}

减速器唯一的任务是根据动作改变状态。你应该设计有意义的动作来触发可预测的状态变化。好吧,很好,但这意味着所有的逻辑都在saga生成器函数中?是的,因为只有在有某种加载动画的情况下,
用户签名才有意义,因为它不一定是登录成功。这个故事应该会产生有意义的动作,这样你的整个逻辑就更清晰,也更容易通过Redux开发工具进行调试。这是关于Reducer和action Creator,但对故事来说同样有效:就个人而言,如果你需要做可提取的逻辑,我更喜欢将其放入实用程序文件中。然后,您可以根据需要将其导入reducer或saga中,这两种方式都不会对代码产生太大影响。