2016-12-09 2 views
0

3つのエフェクトのうち2つが競合して、レースに勝つとサーバーからリフレッシュする必要があります。スマートウェイ2アウト3レースサクサエフェクトと同じフォローアップフロー

私は現在、それを行う方法は次のとおりです。レースのリターン結果を容易にするよりスマートな方法がある場合

function* refreshItems() { 
    while (true) { 
    bool refreshFromServer = true 
    const { nextRefresh, items } = yield call(fetchItems) 
    const racer = { 
     duration: call(delay, 60*1000), 
     manual: take(REFRESH_ITEMS), 
    } 
    if (nextRefresh > 0) { 
     racer.remote = call(delay, nextRefresh * 1000) 
    } 
    const { remote, manual, duration } = yield race(racer) 
    refreshFromServer = remote || manual 
    // alternative: refreshFromServer = !duration 
    } 
} 

を私は疑問に思うが?

答えて

0

あなたのやり方はうまく見えますが、あなたができることの1つはレースを構成することです。 (未テスト)のようなもの:

ところで
function* refreshItems() { 
    while (true) { 
    const { nextRefresh, items } = yield call(fetchItems) 
    const refreshRace = { 
     manual: take(REFRESH_ITEMS) 
    } 
    if (nextRefresh > 0) { 
     refreshRace.remote = call(delay, nextRefresh * 1000) 
    } 
    const racer = { 
     duration: call(delay, 60*1000), 
     refresh: race(refreshRace), 
    } 
    const { refresh, duration } = yield race(racer) 
    ... just use refresh, now 
    } 
} 

、他のいくつかの注意事項:

  • 2つの遅延のあなたのレースは正確に何をしたいに応じて、
  • 少し愚かなようで、あなたは多分デバウンスを使用することができますか?または類似のものを書く
+0

ありがとうございます。これは本当にそのような構成で動作しますか?私は2つの遅延を使用しています。なぜなら、ローカルタイマーだけを更新する必要がある場合( 'duration')、サーバーヒットを防ぎたいからです。 – philk

+0

はい、テストしていませんが、作成する必要があります。レースは他のエフェクトの最初のものが終了するのを待ってから残りをキャンセルする効果です。レースがキャンセルされると、すべてのレーサーがキャンセルされます。だから、レーサーの1人がレースであるとき、適切なことが起こるはずです REの持続時間:遅延は基本的にちょうどsetTimeoutですか? nextRefresh <60の場合は安全にリフレッシュすることができ、それ以上の場合はレースから省略することができます – WuTheFWasThat

+0

継続リフレッシュに関するnextRefreshのヒント。あなたの答えには少しでも不具合があります。 'refreshRace'もレースでなければなりません。だから 'refresh:race(refreshRace)'それはうまくいきます。 – philk

関連する問題