web-dev-qa-db-ja.com

redux-saga:歩留まりのためにプログラムで複数の呼び出し/副作用を作成する方法は?

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;

これは可能ですか?もしそうなら、どのように?

10
itinance

callエフェクトはその時点では何も呼び出さないことに注意してください。プレーンJavaScriptオブジェクトを作成して返すだけです。だからあなたが望むものはそれほど難しくありません。

import { call } from 'redux-saga/effects'

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

これもうまくいくかもしれません 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)
  })
}
3
Ryan George

したがって、 redux saga docs によると、2019年11月17日の時点で、並行して実行するには、all()を使用する必要があります。

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

または、電話をかける前に何かを計算したい場合

yield all( arrayOfSomething.map( eachSomthing => {
   // 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 with I am just coding fast
   return call( myFunction, eachSomething ) )
} )
3
Jose