【问题标题】:dispatch action inside saga watcher after Meteor.call在 Meteor.call 之后在 saga watcher 中调度动作
【发布时间】:2020-01-14 09:32:46
【问题描述】:

我想在 Meteor.call 回调中调度操作。

我尝试将生成器函数作为回调传递,但不起作用。

function* createRegistrationField(action: CreateRegistrationFieldRequest) {
  yield call(function* () {
    yield put(CreateRegistrationFieldRequestRunningAction());
  });

  const { type } = action.payload;

  const callBack = function*(error, _id) {
    console.log("callback called");

    yield put(RegistrationFieldCreatedAction(type, _id));
  };

  Meteor.call("registerFormFields.insert", { type }, callBack);
};


export function* watchCreateRegistrationField() {
  yield takeLatest(CREATE_REGISTRATION_FIELD_REQUEST, createRegistrationField);
};

registerFormFields.insert 看起来像

  Meteor.methods({
    "registerFormFields.insert" (data: object) {
      return RegisterFormFields.insert(data);
    },
    "registerFormFields.list" () {
      return RegisterFormFields.find({}).fetch();
    }
  });

【问题讨论】:

  • 能否请您添加一些有关您希望此方法的行为方式的详细信息。
  • Meteor 不理解生成器函数,所以它会直接调用带有签名 (err, result) 的回调
  • @FredStark 我知道
  • @Jankapunkt 你想知道什么细节?

标签: reactjs meteor redux redux-saga


【解决方案1】:

我自己找到了解决办法。

在 redux-saga 我们有eventChannel

这里是我如何做的例子。

import { eventChannel, END } from "redux-saga";

function createRegistrationFieldChannel(type: string) {
  return eventChannel(emitter => {
    Meteor.call("registerFormFields.insert", { type }, (error, _id) => {
      if (error) {
        emitter({ error });
        emitter(END);
      }

      emitter({ _id });
      emitter(END);
    });

    return () => {};
  });
}

function* createRegistrationField(action: CreateRegistrationFieldRequest) {
  yield call(function*() {
    yield put(CreateRegistrationFieldRequestRunningAction());
  });

  const { type } = action.payload;

  const channel = yield call(createRegistrationFieldChannel, type);

  try {
    while (true) {
      const { error = null, _id } = yield take(channel);

      if (error) {
      } else {
        yield put(RegistrationFieldCreatedAction(type, _id));
      }
    }
  } catch (err) {
    console.log(err);
  }
}

export function* watchCreateRegistrationField() {
  yield takeLatest(CREATE_REGISTRATION_FIELD_REQUEST, createRegistrationField);
}

【讨论】:

    猜你喜欢
    • 2018-08-11
    • 2019-02-28
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2020-01-04
    相关资源
    最近更新 更多