Dva: Entschuldigung, das yield put() in Effekten ist ein nicht blockierender Prozess, wie man einen anderen Effekt in Effekten blockiert und aufruft.

Erstellt am 12. Sept. 2017  ·  12Kommentare  ·  Quelle: dvajs/dva

Code zum Reproduzieren des Problems: (Bitte geben Sie reproduzierbaren Code oder Schritte an)

Erwartetes Verhalten: (erwarteter normaler Effekt)

Tatsächliches Verhalten: (tatsächliche Wirkung)

Verwendete Paketversionen: (welche Version welcher Bibliothek ist das Problem)

Hilfreichster Kommentar

put.resolve() blockiert

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() blockiert, siehe redux-saga API für Details

Alle 12 Kommentare

dva@2 hat das entsprechende Beispiel bereitgestellt, 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
Hier können Sie sich die Lösung ansehen.
Verwenden Sie Anruf direkt, um den Effekt zu blockieren, der Sie anruft.

Aber es gibt ein Problem in dva, das heißt, wie Sie die Effektmethode erhalten, die Sie aufrufen möchten, da die Effektmethode in dva in das Modell geschrieben ist, können Sie selbst darüber nachdenken und sehen, ob es eine Möglichkeit gibt, sie zu bekommen das Ziel aus der Methode model., und verwenden Sie dann call, um es aufzurufen.

@nihgwu

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

Ist dieser Code in Saga eingekapselt? ? Ich kann es im Quellcode von dva nicht sehen. Können Sie mir die Adresse dieses Quellcodes nennen?

@hopperhuang im DVA-Core

Der Effekt in @hopperhuang dva ist in das Modell geschrieben, das stört mich nur, ich weiß nicht, wie ich es rausbekomme. Nachdem ich die Methode von @nihgwu gelesen habe, denke ich, dass es die richtige Lösung ist, rufen Sie sie zuerst an und nehmen Sie dann sofort die Sperrung des Empfangs vor.

Version beachten. Ich weiß nicht, ob die vorgeschlagene Lösung auf dva2.0 oder auf Saga basiert. Im Quellcode von dva1.0 gibt es keine Kapselung der Ereignisse vor und nach dem Aufruf des Put. Sie können Dalian fragen, ob Ihre eigene Version diese Lösung anwenden kann.

-----Die ursprüngliche Nachricht-----
Von: "pingsoli" [email protected]
Gesendet: ‎2017/‎9/‎12 22:24
Empfänger: „dvajs/dva“ [email protected]
CC: „hopperhuang“ [email protected] ; „Erwähnung“ erwä[email protected]
Thema: Re: [dvajs/dva] Entschuldigung. Yield put() in Effekten ist ein nicht blockierender Prozess. Wie man einen anderen Effekt in Effekten blockiert und aufruft. (#1212)

Der Effekt in @hopperhuang dva ist in das Modell geschrieben, das stört mich nur, ich weiß nicht, wie ich es rausbekomme. Nachdem ich die Methode von @nihgwu gelesen habe, denke ich, dass es die richtige Lösung ist, rufen Sie zuerst an und nehmen Sie dann sofort den Block, um zu empfangen.

Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail, zeigen Sie sie auf GitHub an oder schalten Sie den Thread stumm.

Warum willst du sperren, was ist hier das Anwendungsszenario?

Warum willst du sperren, was ist hier das Anwendungsszenario?

Wenn die Put-Aktion von Saga verarbeitet wird (Effekt in dva), dann wurde, wenn Yield Put zurückkehrt, die entsprechende Saga/der entsprechende Effekt noch nicht ausgeführt (der Redux-Saga-Scheduler wird ihn in die Warteschlange einreihen und später schrittweise planen), was nicht erfüllt wird die Sperranforderungen einiger staatlicher Prozesse.

Wenn ich mich richtig erinnere, wird die Put-Aktion vom Reducer ohne dieses Problem verarbeitet, denn wenn der Yield-Put zurückkehrt, wurde der entsprechende Reducer bereits ausgeführt.

Dies sind eigentlich die Vorkehrungen von Redux-Saga, aber beim Schreiben von Effekten in DVA wird die Generatorfunktion als Effekt verwendet und durch die Put-Aktion ausgelöst. Es wird tatsächlich viele Generatorfunktionen geben, die Aktionen nicht direkt verarbeiten, sondern von anderen Saga-/Generatorfunktionen aufgerufen werden.

Mein persönlicher Ansatz ist die Wiederherstellung der Schreibmethode bei direkter Verwendung von redux-saga: Nur die Generatorfunktion, die direkt auf die Aktion reagiert, wird in die dva-Effekte eingefügt, und die anderen sind alle kostenlos.

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
}

Wenn die kostenlose Generatorfunktion call / select /... von Saga benötigt, kann sie direkt aus Saga importiert werden:

import { effects } from 'dva/saga'

const { call, select } = effects

Aber die put und take , die von dva für die Methoden in seinen Effekten bereitgestellt werden, werden einmal gekapselt (nämlich Namespace-Präfix-Verarbeitung) und müssen durch die Effektmethoden geleitet werden:
in https://github.com/dvajs/dva/blob/master/packages/dva-core/src/getSaga.js#L141

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

Oder schreiben Sie einfach den vollständigen Aktionstyp:

import { effects } from 'dva/saga'

const { take } = effects

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

put.resolve() blockiert

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() blockiert, siehe redux-saga API für Details

Warum willst du sperren, was ist hier das Anwendungsszenario?

Wenn die Put-Aktion von Saga verarbeitet wird (Effekt in dva), dann wurde, wenn Yield Put zurückkehrt, die entsprechende Saga/der entsprechende Effekt noch nicht ausgeführt (der Redux-Saga-Scheduler wird ihn in die Warteschlange einreihen und später schrittweise planen), was nicht erfüllt wird die Sperranforderungen einiger staatlicher Prozesse.

Wenn ich mich richtig erinnere, wird die Put-Aktion vom Reducer ohne dieses Problem verarbeitet, denn wenn der Yield-Put zurückkehrt, wurde der entsprechende Reducer bereits ausgeführt.

Ja, ich habe versucht, Yield Put (Reduzierer) ist synchron und Yield Put (Effekte) ist asynchron

Warum kannst du es nicht direkt setzen, du musst nachgeben???

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen