Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
huang6349 opened this issue Oct 9, 2016 · 11 comments
Labels

Comments

@huang6349
Copy link

effects: {

/**
 * 数据查询
 * 
 * @param {any} { payload }
 * @param {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,
      },
    });
  }
}

},

@huang6349
Copy link
Author

effects: {

/**
 * 数据查询
 * 
 * @param {any} { payload }
 * @param {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,
      },
    });
  }
}

},

@sorrycc
Copy link
Member

sorrycc commented Oct 9, 2016

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

@huang6349
Copy link
Author

了解了,谢谢大神

@llqgit
Copy link

llqgit commented Oct 10, 2016

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

@sorrycc
Copy link
Member

sorrycc commented Oct 10, 2016

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

@llqgit
Copy link

llqgit commented Oct 10, 2016

@miaojiuchen
Copy link

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

@sorrycc
Copy link
Member

sorrycc commented Nov 17, 2016

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

@xgenvn
Copy link

xgenvn commented Feb 6, 2018

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

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

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

谢谢。

@realeve
Copy link

realeve commented Mar 1, 2018

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

@fishedee
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

7 participants