Reactjs react redux传奇中的句柄同步

Reactjs react redux传奇中的句柄同步,reactjs,synchronization,react-redux,yield,redux-saga,Reactjs,Synchronization,React Redux,Yield,Redux Saga,用户将输入姓名、电子邮件和订单信息,包括付款详细信息。 单击表单中的“立即购买”按钮后,我计划执行以下步骤: 通过api调用创建用户。 通过自动登录并获取令牌 api调用。 使用表单数据创建ORDERBY api调用。 通过api调用获取支付提供商令牌。 转到付款页面。 在前端使用React-redux传奇 请在下面输入代码: function* addToCartCamp(action) { try { // User creation and login yield p

用户将输入姓名、电子邮件和订单信息,包括付款详细信息。 单击表单中的“立即购买”按钮后,我计划执行以下步骤:

通过api调用创建用户。 通过自动登录并获取令牌 api调用。 使用表单数据创建ORDERBY api调用。 通过api调用获取支付提供商令牌。 转到付款页面。 在前端使用React-redux传奇

请在下面输入代码:

function* addToCartCamp(action) {
  try {

    // User creation and login
    yield put({ type: authActions.AUTH_REGISTER_REQUEST, ...createUser });
    yield put({ type: authActions.AUTH_REGISTER_SUCCESS, ...userdata });
    yield put({ type: authActions.AUTH_LOGIN_REQUEST, ...login });

    //Create order
    const { data } = yield orderAPI.addToCartCamp(action);
    yield put({ type: orderActions.ADD_TO_CART_SUCCESS, ...data });
    yield put({ type: orderActions.GET_DETAIL_ORDER_REQUEST, ...{orderId: order_id} });

    //Handle Payment
     if(action.payment.method === 'creditCard'){
      yield put({ type: orderActions.TOKEN_REQUEST, ...{orderId: order_id} });
     } else{
      yield put({ type: orderActions.BANK_TRANSFER_REQUEST, ...{orderId: order_id} });
     }
  } catch (error) {
      // handle error message
  }
}
我可以在saga文件中调用多个Yield put,然后调用api吗。调用此函数时,后端甚至在创建和登录用户之前就开始订单创建过程

我需要所有进程同步运行,但它们当前以异步方式运行

新的传奇和反应。如何处理这个问题;dr:在执行成功操作之前,您需要执行一个操作并调用api以生成其结果

实例 附加说明 在我看来,你在一个传奇故事中有太多的事情。为什么要在创建订单的同一地点注册用户?我会将这两个用例分成两个不同的故事,因为您可能有一个已经注册的用户,在购买东西之前只需要登录。不要在订单中处理身份验证,让API处理身份验证失败

说到这里,您还应该对api调用失败进行操作。因此,当服务器返回401,因为用户无权购物时,您应该生成put特定的orderActions.SOMETHING\u FAILURE操作,带有存储错误消息的减速机,处理挂起状态等

使用全局try-catch块会使调试非常困难,应该避免。请参见最后一个代码示例:

import Api from './path/to/api'
import { call, put } from 'redux-saga/effects'

function fetchProductsApi() {
  return Api.fetch('/products')
    .then(response => ({ response }))
    .catch(error => ({ error }))
}

function* fetchProducts() {
  const { response, error } = yield call(fetchProductsApi)
  if (response) {
    yield put({ type: 'PRODUCTS_RECEIVED', products: response })
  } else {
    yield put({ type: 'PRODUCTS_REQUEST_FAILED', error })
  }
}
tl;dr:在执行成功操作之前,您需要执行一个操作并调用api以生成其结果

实例 附加说明 在我看来,你在一个传奇故事中有太多的事情。为什么要在创建订单的同一地点注册用户?我会将这两个用例分成两个不同的故事,因为您可能有一个已经注册的用户,在购买东西之前只需要登录。不要在订单中处理身份验证,让API处理身份验证失败

说到这里,您还应该对api调用失败进行操作。因此,当服务器返回401,因为用户无权购物时,您应该生成put特定的orderActions.SOMETHING\u FAILURE操作,带有存储错误消息的减速机,处理挂起状态等

使用全局try-catch块会使调试非常困难,应该避免。请参见最后一个代码示例:

import Api from './path/to/api'
import { call, put } from 'redux-saga/effects'

function fetchProductsApi() {
  return Api.fetch('/products')
    .then(response => ({ response }))
    .catch(error => ({ error }))
}

function* fetchProducts() {
  const { response, error } = yield call(fetchProductsApi)
  if (response) {
    yield put({ type: 'PRODUCTS_RECEIVED', products: response })
  } else {
    yield put({ type: 'PRODUCTS_REQUEST_FAILED', error })
  }
}

谢谢你的建议。我将帐户创建和登录移动到页面中的另一个按钮操作,其余的移动到另一个按钮操作。现在工作顺利,没有问题。很高兴我能帮忙。顺便说一句,如果我的回答解决了你的问题,你可以接受并投票表决。谢谢你的建议。我将帐户创建和登录移动到页面中的另一个按钮操作,其余的移动到另一个按钮操作。现在工作顺利,没有问题。很高兴我能帮忙。顺便说一句,如果我的回答解决了你的问题,你可以接受并投票赞成。