redux-saga:如何以编程方式为产量创建多个调用/副作用?

Posted

技术标签:

【中文标题】redux-saga:如何以编程方式为产量创建多个调用/副作用?【英文标题】:redux-saga: How to create multiple calls/side-effects programmatically for yield? 【发布时间】:2017-02-23 21:56:32 【问题描述】:

使用 redux-saga,可以并行执行多个效果:

import  call  from 'redux-saga/effects'

// correct, effects will get executed in parallel
const [users, repos]  = yield [
  call(fetch, '/users'),
  call(fetch, '/repos')
]

我如何以编程方式创建这些“调用”调用?

我想要实现的是:

假设我有一个具有不同参数的数组,我想根据参数执行对服务器的请求,但与 redux-saga 并行:

const parameters = ['abc', 'def', 'ghi']

const allMyFetchCalls  = parameters.map( (p) => makeCallRequestWithParameter(p) );

makeCallRequestWithParameter 会创建一个函数调用(或在 redux-saga-speech 中:一个效果)call(fetch, param) 就像在 yield call(fetch, param)

const resultArray = yield allMyFetchCalls;

这可能吗?如果可以,怎么做?

【问题讨论】:

【参考方案1】:

请注意call 效果当时不会调用任何东西。 它只是创建纯 javascript 对象并返回。所以你想要的并不是那么难。

import  call  from 'redux-saga/effects'

const params = ['abc', 'def', 'ghi']
const responses  = yield params.map(p => call(fetch, p))

【讨论】:

哇!非常感谢! 会不会并发? 它是并发的。【参考方案2】:

因此,根据截至 2019 年 11 月 17 日的 redux saga docs,它说为了使其并行执行,您需要使用 all()

yield all( arrayOfSomething.map( eachSomething => call( myFunction, eachSomething ) ) )

或者如果你想在打电话之前计算一些东西

yield all( arrayOfSomething.map( eachSomething => 
   // do some computations

   // important you return the function which is automatically done 
   // for you in the one line map, this has gotten me a few 
   // times when I am just coding fast
   return call( myFunction, eachSomething ) )
 )

【讨论】:

【参考方案3】:

这也可以https://github.com/redux-saga/redux-saga/tree/master/docs/api#alleffects

function* mySaga() 
  const  customers, products  = yield all(
    customers: call(fetchCustomers),
    products: call(fetchProducts)
  )

【讨论】:

在所有请求都成功时工作,但即使单个调用失败也会抛出错误。即使有些请求失败,我也想得到所有请求的响应。怎么办?

以上是关于redux-saga:如何以编程方式为产量创建多个调用/副作用?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式创建多个 NSTextField?

如何在android中以编程方式创建多个列表

在 Android 中以编程方式创建的多个文本视图的单个 onclick 侦听器

ipad如何在一个视图上以编程方式创建多个表

如何以编程方式将 2 个或多个 .WAV 文件连接在一起?

如何以编程方式在方板上创建多个 UIImageView