Dva: 1.0 未暴露 saga 的所有方法, 怎么获取 ?

Created on 27 Sep 2016  ·  14Comments  ·  Source: dvajs/dva

image

1.0 貌似只暴露了有限几个 saga 的方法, 如何引用其他方法

faq question

Most helpful comment

effect 支持 3 种类型:takeEverytakeLatestwatcher

  • takeEvery: 每次都执行
  • takeLatest: 只执行最后一次
  • watcher: 通过 take 等 effect 完全自定义 saga

默认是 takeEvery,如果要换另两种,用 [function*(){}, options] 的格式,比如:

app.model({
  effects: {
    addRemote: [*function(action, {put, select, call}) {
      /* Your Code Here */
    }, { type: 'takeLatest' }]
  }
});

或者

const takeLatest = fn => [fn, { type: 'takeLatest' }];

app.model({
  effects: {
    addRemote: takeLatest(*function(action, { put, select, call }) {
      /* Your Code Here */
    }
  }
});

All 14 comments

image

看官方文档里讲了这几个方法

这是哪里的文档? 贴个地址看看。

看源代码看到的....
之前看到 saga 是暴露了所有方法的, dva 只暴露了 saga/effects 部分
我该直接 import { ... } from 'redux-saga' 吗 ?

不需要再引 redux-saga 的。

你看在根目录下再加一个 saga.js

module.exports = require('redux-saga');

这样成吗?

你是想用 delay 和 CANCEL 吗?

对, 现在这个场景是. 不排除 takeEvery takeLatest

不过最好是 @sorrycc 有空的话能出个文档总结下最佳实践, 说明下 dva 引入 saga api 选择中, 在复杂度 和 功能性之间的权衡 , 这样可以使后来者避免误用

毕竟在 dva 里 saga 的分量还是很重的.

我现在的用法是参考 saga 文档里的, dva 的文档里没有, 心里也是忐忑的 🐶

effect 支持 3 种类型:takeEverytakeLatestwatcher

  • takeEvery: 每次都执行
  • takeLatest: 只执行最后一次
  • watcher: 通过 take 等 effect 完全自定义 saga

默认是 takeEvery,如果要换另两种,用 [function*(){}, options] 的格式,比如:

app.model({
  effects: {
    addRemote: [*function(action, {put, select, call}) {
      /* Your Code Here */
    }, { type: 'takeLatest' }]
  }
});

或者

const takeLatest = fn => [fn, { type: 'takeLatest' }];

app.model({
  effects: {
    addRemote: takeLatest(*function(action, { put, select, call }) {
      /* Your Code Here */
    }
  }
});

好的, 谢谢
能引用 delay 方法吗?

delay 不能引,一行代码就可以实现了。

const delay = (timeout) => new Promise(resolve => setTimeout(resolve, timeout));

然后

yield call(delay, 1000);

希望能完善一下API文档,[function*(){}, options]这样的写法在文档中似乎没有提及

这属于高级功能,空点了就会完善这部分的文档。

Was this page helpful?
0 / 5 - 0 ratings