Dva: すみません、エフェクトのyield put()は非ブロッキングプロセスであり、エフェクトの別のエフェクトをブロックして呼び出す方法です。

作成日 2017年09月12日  ·  12コメント  ·  ソース: dvajs/dva

問題を再現するためのコード:(再現可能なコードまたは手順を提供してください)

期待される動作:(期待される通常の効果)

実際の動作:(実際の効果)

使用されているパッケージのバージョン:(問題となっているライブラリのバージョン)

最も参考になるコメント

put.resolve()がブロックされています

yield put.resolve({ type: 'addDelay', payload: { amount: 2 } });
const count = yield select(state => state.count);
yield put({ type: 'addDelay', payload: { amount: count, delay: 0 } });

put.resolve()がブロックされています。詳細については、redux-sagaAPIを参照してください。

全てのコメント12件

dva @ 2は、対応する例https://github.com/sorrycc/blog/issues/48を提供しています。

yield put({ type: 'addDelay', payload: { amount: 2 } });
yield take('addDelay/@<strong i="8">@end</strong>');
const count = yield select(state => state.count);
yield put({ type: 'addDelay', payload: { amount: count, delay: 0 } });

https://github.com/redux-saga/redux-saga/issues/744
ここで解決策を見ることができます。
直接呼び出しを使用して、呼び出し元の効果をブロックします。

しかし、dvaには問題があります。つまり、呼び出したいエフェクトメソッドをどのように取得するかです。dvaのエフェクトメソッドはモデルに記述されているため、ターゲットを取得する方法があるかどうかを自分で考えることができます。モデルメソッドを呼び出し、callを使用して呼び出します。

@nihgwu

effect 前后会额外触发 /@<strong i="6">@start</strong> 和 /@<strong i="7">@end</strong> 的 action,

このコードはsagaにカプセル化されていますか? ? dvaのソースコードではわかりません。このソースコードのアドレスを教えてください。

dva-coreの@hopperhuang

@hopperhuang dvaの効果はモデルに書かれています、私はこれに悩まされています、私はそれを取り出す方法がわかりません。 @nihgwuのメソッドを読んだ後、それが正しい解決策だと思います。最初に呼び出してから、すぐにブロックして受信します。

バージョンに注意してください。提案されたソリューションがdva2,0に基づいているのか、sagaに基づいているのかわかりません。 dva1.0のソースコードでは、putが呼び出される前後のイベントのカプセル化はありません。Dalianに、独自のバージョンでこのソリューションを適用できるかどうかを確認するように依頼できます。

-----元のメッセージ-----
差出人:「pingsoli」 [email protected]
送信済み:2017/9/12 22:24
受信者: "dvajs / dva" [email protected]
CC: "hopperhuang" [email protected] ; "メンション"言及@ noreply.github.com
トピック:Re:[dvajs / dva]すみません。エフェクトでのyieldput()は非ブロッキングプロセスです。エフェクトで別のエフェクトをブロックして呼び出す方法。(#1212)

@hopperhuang dvaの効果はモデルに書かれています、私はこれに悩まされています、私はそれを取り出す方法がわかりません。 @nihgwuのメソッドを読んだ後、それが正しい解決策だと思います。最初に呼び出してから、すぐにブロックして受信します。

あなたが言及されたので、あなたはこれを受け取っています。
このメールに直接返信するか、GitHubで表示するか、スレッドをミュートしてください。

なぜプットをブロックしたいのですか?ここでのアプリケーションシナリオは何ですか?

なぜプットをブロックしたいのですか?ここでのアプリケーションシナリオは何ですか?

putのアクションがsaga(dvaの効果)によって処理される場合、yield putが返されるとき、対応するsaga / effectはまだ実行されていません(redux-sagaスケジューラーはそれをキューに入れ、後で徐々にスケジュールします)。一部の状態プロセスのブロッキング要件。

私の記憶が正しければ、プットアクションはこの問題なくレデューサーによって処理されます。これは、yield putが戻ったときに、対応するレデューサーがすでに実行されているためです。

これらは実際にはredux-sagaの予防策ですが、dvaでエフェクトを書き込む方法では、ジェネレーター関数がエフェクトとして使用され、putアクションによってトリガーされます。実際には、アクションを直接処理しないが、他のsaga / generator関数によって呼び出されるジェネレーター関数が多数あります。

私の個人的なアプローチは、redux-sagaを直接使用する場合は、書き込み方法に戻すことです。アクションに直接応答するジェネレーター関数のみがdvaエフェクトに組み込まれ、その他はすべて無料です。

const model = {
  // ...

  effects: {
    * showItem({ payload }, { call }) {

      // 用:
      yield call(showItemFirstStageProcedure)
      yield call(showItemSecondStageProcedure)

      // 而不是:
      // yield put({ type: 'showItemFirstStage' })
      // yield take('showItemFirstStage/@<strong i="7">@end</strong>')
      // yield put({ type: 'showItemSecondStage' })
      // yield take('showItemSecondStage/@<strong i="8">@end</strong>')
      // ...after second stage
    },

    // ...
    // end effects
  },

  // ...
  // end model
}

無料のジェネレーター関数がsagaのcall / select / ...を必要とする場合、sagaから直接インポートできます。

import { effects } from 'dva/saga'

const { call, select } = effects

ただし、dvaがそのエフェクトのメソッドに提供するputtakeは、一度カプセル化され(つまり、名前空間プレフィックス処理)、エフェクトメソッドを通過する必要があります。
https://github.com/dvajs/dva/blob/master/packages/dva-core/src/getSaga.js#L141

return { ...sagaEffects, put, take };

または、完全なアクションタイプを記述します。

import { effects } from 'dva/saga'

const { take } = effects

// then
take(`${namespace}/${actionType}`)

put.resolve()がブロックされています

yield put.resolve({ type: 'addDelay', payload: { amount: 2 } });
const count = yield select(state => state.count);
yield put({ type: 'addDelay', payload: { amount: count, delay: 0 } });

put.resolve()がブロックされています。詳細については、redux-sagaAPIを参照してください。

なぜプットをブロックしたいのですか?ここでのアプリケーションシナリオは何ですか?

putのアクションがsaga(dvaの効果)によって処理される場合、yield putが返されるとき、対応するsaga / effectはまだ実行されていません(redux-sagaスケジューラーはそれをキューに入れ、後で徐々にスケジュールします)。一部の状態プロセスのブロッキング要件。

私の記憶が正しければ、プットアクションはこの問題なくレデューサーによって処理されます。これは、yield putが戻ったときに、対応するレデューサーがすでに実行されているためです。

はい、yield put(reducers)は同期で、yield put(effects)は非同期です。

なぜあなたはそれを直接置くことができないのですか、あなたはプットを譲らなければなりませんか?

このページは役に立ちましたか?
0 / 5 - 0 評価