在redux saga中有多个post函数

时间:2017-03-08 14:17:32

标签: javascript reactjs redux redux-saga

我想实现将设备移动到用户创建的组的功能。功能是用户选择时的功能 设备,出现一个创建组按钮。单击“创建组”按钮将打开表单,供用户创建组和 当用户使用组名填充表单时,将运行具有POST功能的saga的createGroup 并且创建组的URL是

  

/ device_groups

,我已经完成并且正在工作,但现在用户已经创建了所选的组 设备应移动到该创建的组。我该怎么做?将设备发布到该创建的组的URL是

  

/ device_group /的groupId /添加

简而言之,用户选择设备或设备并显示创建组按钮,用户创建一个组,然后应将那些选定的设备移动到该组。

并且它只接受所选设备ID的列表。

function* createGroup(action) {
  console.log('action', action);
  const group = action.group;
  const deviceId = action.deviceId;
  if (yield call(isGroupValid, fromJS(action.group))) {
    yield fork(POST(`/device_groups`, createGroupSuccess, createGroupError, group));
  }
}

case CREATE_GROUP:
  return state
    .set('loading', true)
    .set('error', null);

case CREATE_GROUP_SUCCESS:
  const deviceGroups = fromJS(action.group, idReviver);
  return state.set('loading', false).set('error', null)
    .setIn(['deviceGroups', deviceGroups.get('id')], deviceGroups);

export function createGroup(group, deviceId) {
  return {
    type: CREATE_GROUP,
    group,
    deviceId
  };
}

export function createGroupSuccess(group) {
  return {
    type: CREATE_GROUP_SUCCESS,
    group,
  };
}

1 个答案:

答案 0 :(得分:0)

如果可能,我会做的是更改组创建api端点以接受进入该组的设备ID列表。这样你只需要拨打一个api电话。

如果那是不可能的,我会修改传奇来做类似的事情:

function* createGroup(action) {
  try {
    const group = action.group;
    const deviceIds = action.deviceIds;
    if (yield call(isGroupValid, fromJS(action.group))) {
      // Create group
      const createdGroup = yield call(API.createGroup, group);
      // Add devices to new group
      yield deviceIds.map((deviceId) => call(API.addDeviceToGroup, createdGroup, deviceId));
      // Success action
      yield put(createGroupSuccess(createdGroup));
    }
  } catch (e) {
    yield put(createGroupFailed(group));
  }
}

此处API包含返回promises并执行实际休息调用的函数。