Dva: 在effects中使用async/await做异步不起作用?要必须使用*/yield吗?

创建于 2016-10-09  ·  11评论  ·  资料来源: dvajs/dva

效果:{

/**
 * 数据查询
 * 
 * <strong i="6">@param</strong> {any} { payload }
 * <strong i="7">@param</strong> {any} { select, call, put }
 */
query: async function ({ payload }, { select, call, put }) {
  await put({ type: 'show_loading' });
  payload.page = payload.page || 1;
  payload.limit = payload.limit || 10;
  let data = await call(query, '/home/course', payload);
  if (data) {
    await put({
      type: 'query_success',
      payload: {
        list: data.data,
        total: data.count,
        current: data.currentPage,
      },
    });
  }
}

},

最有用的评论

@sorrycc 既然你这里也提出了什么场景需要使用cancel,事实上大多数情况下async/await足矣。目前的用法里,用 generator/yield 再去调用 async/await,这样太蛋疼了,作者可以考虑同时支持两种模式,让用户自己去选择,比如增加一个配置项,开启后调用async/await模式,或者自适应判断。

所有11条评论

效果:{

/**
 * 数据查询
 * 
 * <strong i="6">@param</strong> {any} { payload }
 * <strong i="7">@param</strong> {any} { select, call, put }
 */
query: function* ({ payload }, { select, call, put }) {
  yield put({ type: 'show_loading' });
  payload.page = payload.page || 1;
  payload.limit = payload.limit || 10;
  let data = yield call(query, '/home/course', payload);
  if (data) {
    yield put({
      type: 'query_success',
      payload: {
        list: data.data,
        total: data.count,
        current: data.currentPage,
      },
    });
  }
}

},

是的,effect 只支持 generator 的写法。asyncawait 可以在 effect 之外用,然后在 effect 里用 yield call 去调。

了解了,谢谢大神

请问,effect 有机会在将来支持 async 吗? @sorrycc

async 没有 generator 可控,比如不能 cancel,这也是 redux-saga 选择用 generator 的原因。

@sorrycc 请问要如何cancel一个effect呢?

@miaojiuchen 场景是啥? 为啥要 cancel effect ?

@sorrycc 我在遇到这样的场景:

  • effect 1:请求成功,返回一个数字,调用effect 2 - 相减计数机处理
  • effect 2:while(true) => delay 然后 dispatch reducer

这样在一个页面没问题,但是如果访问其他页面,再返回上页面,就会重复effect 2.
怎么能在effect 1 先cancel effect然后再触发effect 2?
是不是得用路径subcriptions 调用@@CANCEL_EFFECTS?

谢谢。

@sorrycc 既然你这里也提出了什么场景需要使用cancel,事实上大多数情况下async/await足矣。目前的用法里,用 generator/yield 再去调用 async/await,这样太蛋疼了,作者可以考虑同时支持两种模式,让用户自己去选择,比如增加一个配置项,开启后调用async/await模式,或者自适应判断。

可以试试redva,一样的dva框架,默认开启async/await和immer

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

huyawei picture huyawei  ·  3评论

ufohjl picture ufohjl  ·  3评论

not3 picture not3  ·  3评论

ljjsimon picture ljjsimon  ·  3评论

mclouvem picture mclouvem  ·  4评论