dva初探

作者: 别过经年 | 来源:发表于2020-02-09 17:16 被阅读0次

    dva@2.4.1
    getSaga.js

      function* sagaWithCatch(...args) {
        const { __dva_resolve: resolve = noop, __dva_reject: reject = noop } =
          args.length > 0 ? args[0] : {};
        try {
          yield sagaEffects.put({ type: `${key}${NAMESPACE_SEP}@@start` });
          const ret = yield effect(...args.concat(createEffects(model)));//effect就是model中定义的effect,在此执行
          yield sagaEffects.put({ type: `${key}${NAMESPACE_SEP}@@end` });
          resolve(ret);
        } catch (e) {
          onError(e, {
            key,
            effectArgs: args,
          });
          if (!e._dontReject) {
            reject(e);
          }
        }
      }
    

    dva-loading@3.0.14

    
      function onEffect(effect, { put }, model, actionType) {
        const { namespace } = model;
        if (
          (only.length === 0 && except.length === 0) ||
          (only.length > 0 && only.indexOf(actionType) !== -1) ||
          (except.length > 0 && except.indexOf(actionType) === -1)
        ) {
          return function*(...args) {
            yield put({ type: SHOW, payload: { namespace, actionType } });// 触发显示
            yield effect(...args);// 执行dva-core getSaga.js sagaWithCatch函数
            yield put({ type: HIDE, payload: { namespace, actionType } });// 触发隐藏
          };
        } else {
          return effect;
        }
      }
    

    业务代码:

        *doDeleteAppBatch({ payload: { appIds, projectId } }, { call, put }) {
          yield call(doDeleteApp, appIds);
          yield put({ type: "doGetAppList", payload: projectId });// 删除后获取list
        },
        *doGetAppList({ payload }, { call, put }) {
          const  data = yield call(doGetAppList);
          yield put({ type: "setAppList", payload: data });
        },
    

    因为在doDeleteAppBatch中会调用代码doGetAppList effect,本以为doDeleteAppBatch导致的loading会包括doGetAppList的调用时间,debug后发现其实不是这样子,doDeleteAppBatch执行完后,会触发hide,调用yield put({ type: "doGetAppList", payload: projectId });会触发新的show,并不是因为doDeleteAppBatch调用doGetAppList完成(这里指调用接口完成)后才关闭doDeleteAppBatch的loading。

    相关文章

      网友评论

          本文标题:dva初探

          本文链接:https://www.haomeiwen.com/subject/dkrnxhtx.html