Dva: Bolehkah saya bertanya bagaimana hasil put() in effects adalah proses non-blocking, bagaimana cara memblokir dan memanggil efek lain di effects.

Dibuat pada 12 Sep 2017  ·  12Komentar  ·  Sumber: dvajs/dva

Kode untuk mereproduksi masalah: (Harap berikan kode atau langkah yang dapat direproduksi)

Perilaku yang diharapkan: (efek normal yang diharapkan)

Perilaku aktual: (efek aktual)

Versi paket yang digunakan: (versi perpustakaan mana yang bermasalah)

Komentar yang paling membantu

put.resolve() memblokir

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() memblokir, lihat redux-saga API untuk detailnya

Semua 12 komentar

dva@2 telah memberikan contoh yang sesuai, 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
Anda dapat melihat solusinya di sini.
Gunakan panggilan langsung untuk memblokir efek yang memanggil Anda.

Tetapi ada masalah di dva, yaitu, bagaimana Anda mendapatkan metode efek yang ingin Anda panggil, karena metode efek di dva ditulis dalam model, Anda dapat memikirkannya sendiri dan melihat apakah ada cara untuk mendapatkannya target dari metode model., dan kemudian gunakan panggilan untuk memanggilnya.

@nihgwu

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

Apakah kode ini dienkapsulasi dalam saga? ? Saya tidak bisa melihatnya di kode sumber dva. Bisakah Anda memberi tahu saya alamat kode sumber ini?

@hopperhuang di dva-core

Kesannya di @hopperhuang dva di tulis di modelnya, saya risih ini aja, ga tau cara ngilanginnya. Setelah membaca metode @nihgwu , saya pikir itu adalah solusi yang tepat, telepon dulu, lalu segera ambil blok untuk menerima.

Perhatikan versinya. Saya tidak tahu apakah solusi yang diusulkan didasarkan pada dva2,0 atau berdasarkan saga. Dalam kode sumber dva1.0, tidak ada enkapsulasi kejadian sebelum dan sesudah put dipanggil. Anda dapat meminta Dalian untuk melihat apakah versi Anda sendiri dapat menerapkan solusi ini.

-----Pesan asli-----
Dari: notifikasi "pingsoli"@github.com
Dikirim: ‎2017/‎9/‎12 22:24
Penerima: "dvajs/dva" [email protected]
CC: "hopperhuang" [email protected] ; "Mention" [email protected]
Topik: Re: [dvajs/dva] Permisi. Hasil put() in effects adalah proses non-blocking. Cara memblokir dan memanggil efek lain di efek. (#1212)

Kesannya di @hopperhuang dva di tulis di modelnya, saya risih ini aja, ga tau cara ngilanginnya. Setelah membaca metode @nihgwu , saya pikir itu adalah solusi yang tepat, panggil dulu, lalu segera ambil untuk memblokir penerimaan.

Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub, atau matikan utasnya.

Mengapa Anda ingin memblokir put? Apa skenario aplikasi di sini?

Mengapa Anda ingin memblokir put? Apa skenario aplikasi di sini?

Jika aksi put diproses oleh saga (efek dalam dva), maka ketika yield put kembali, saga/efek yang sesuai belum dieksekusi (penjadwal redux-saga akan mengantrekan dan menjadwalkannya secara bertahap nanti) , yang tidak memenuhi persyaratan pemblokiran dari beberapa proses keadaan.

Jika saya ingat dengan benar, tindakan put diproses oleh peredam tanpa masalah ini, karena ketika hasil put kembali, peredam yang sesuai telah dieksekusi.

Ini sebenarnya adalah tindakan pencegahan redux-saga, tetapi dalam cara menulis efek di dva, fungsi generator digunakan sebagai efek dan dipicu oleh tindakan put. Sebenarnya akan ada banyak fungsi generator yang tidak menangani tindakan secara langsung, tetapi dipanggil oleh fungsi saga/generator lainnya.

Pendekatan pribadi saya adalah mengembalikan ke metode penulisan saat menggunakan redux-saga secara langsung.Hanya fungsi generator yang secara langsung merespons tindakan yang dimasukkan ke dalam efek dva, dan yang lainnya semuanya gratis.

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
}

Ketika fungsi generator gratis membutuhkan call / select /... dari saga, itu dapat diimpor langsung dari saga:

import { effects } from 'dva/saga'

const { call, select } = effects

Tetapi put dan take yang disediakan oleh dva untuk metode dalam efeknya dienkapsulasi sekali (yaitu, pemrosesan awalan namespace) dan harus melewati metode efek:
di https://github.com/dvajs/dva/blob/master/packages/dva-core/src/getSaga.js#L141

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

Atau cukup tulis jenis tindakan lengkap:

import { effects } from 'dva/saga'

const { take } = effects

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

put.resolve() memblokir

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() memblokir, lihat redux-saga API untuk detailnya

Mengapa Anda ingin memblokir put? Apa skenario aplikasi di sini?

Jika aksi put diproses oleh saga (efek dalam dva), maka ketika yield put kembali, saga/efek yang sesuai belum dieksekusi (penjadwal redux-saga akan mengantrekan dan menjadwalkannya secara bertahap nanti) , yang tidak memenuhi persyaratan pemblokiran dari beberapa proses keadaan.

Jika saya ingat dengan benar, tindakan put diproses oleh peredam tanpa masalah ini, karena ketika hasil put kembali, peredam yang sesuai telah dieksekusi.

Ya, saya telah mencoba hasil put (pereduksi) sinkron dan hasil put (efek) tidak sinkron

Kenapa tidak bisa langsung ditaruh, harus mengalah???

Apakah halaman ini membantu?
0 / 5 - 0 peringkat