apakah mungkin mengirim tindakan dalam peredam itu sendiri? Saya memiliki progressbar dan elemen audio. Tujuannya adalah untuk memperbarui progressbar ketika waktu diperbarui dalam elemen audio. Tapi saya tidak tahu di mana harus menempatkan eventhandler ontimeupdate, atau bagaimana mengirim tindakan dalam panggilan balik ontimeupdate, untuk memperbarui progressbar. Ini kode saya:
//reducer
const initialState = {
audioElement: new AudioElement('test.mp3'),
progress: 0.0
}
initialState.audioElement.audio.ontimeupdate = () => {
console.log('progress', initialState.audioElement.currentTime/initialState.audioElement.duration);
//how to dispatch 'SET_PROGRESS_VALUE' now?
};
const audio = (state=initialState, action) => {
switch(action.type){
case 'SET_PROGRESS_VALUE':
return Object.assign({}, state, {progress: action.progress});
default: return state;
}
}
export default audio;
AudioElement
? Sepertinya itu seharusnya tidak menjadi sesuatu dalam keadaan.Jawaban:
Mengirim tindakan dalam peredam adalah anti-pola . Peredam Anda harus tanpa efek samping, cukup mencerna payload tindakan dan mengembalikan objek keadaan baru. Menambahkan pendengar dan mengirim tindakan dalam peredam dapat menyebabkan aksi berantai dan efek samping lainnya.
Kedengarannya seperti
AudioElement
kelas yang diinisialisasi Anda dan pendengar acara termasuk dalam komponen dan bukan dalam keadaan. Dalam pendengar acara, Anda dapat mengirim tindakan, yang akan diperbaruiprogress
dalam keadaan.Anda dapat menginisialisasi
AudioElement
objek kelas di komponen Bereaksi baru atau hanya mengkonversi kelas itu ke komponen Bereaksi.Perhatikan bahwa
updateProgressAction
secara otomatis dibungkus dengandispatch
sehingga Anda tidak perlu menelepon pengiriman langsung.sumber
MyAudioPlayer
komponen dari wadah induk yangconnect
diedit bersamareact-redux
. Lihat cara melakukannya dengan dimapDispatchToProps
sini: github.com/reactjs/react-redux/blob/master/docs/…updateProgressAction
didefinisikan dalam contoh Anda?redux-thunk
mengirimkan tindakan dari tindakan lain, bukan peredam. stackoverflow.com/questions/35411423/…Memulai pengiriman lain sebelum peredam Anda selesai adalah anti-pola , karena status yang Anda terima di awal peredam Anda tidak akan menjadi status aplikasi saat ini saat peredam Anda selesai. Tapi menjadwalkan pengiriman lain dari dalam peredam BUKAN anti-pola . Sebenarnya, itulah yang dilakukan bahasa Elm, dan seperti yang Anda ketahui Redux adalah upaya untuk membawa arsitektur Elm ke JavaScript.
Ini adalah middleware yang akan menambahkan properti
asyncDispatch
ke semua tindakan Anda. Ketika peredam Anda telah selesai dan mengembalikan status aplikasi baru,asyncDispatch
akan terpicustore.dispatch
dengan tindakan apa pun yang Anda berikan.Sekarang peredam Anda dapat melakukan ini:
sumber
dispatch
yang harus mengembalikan tindakan. Saya mengubah baris terakhir menjadi:const res = next(actionWithAsyncDispatch); syncActivityFinished = true; flushQueue(); return res;
dan itu bekerja dengan baik.Anda dapat mencoba menggunakan perpustakaan seperti redux-saga . Ini memungkinkan untuk cara yang sangat bersih untuk mengurutkan fungsi-fungsi async, menjalankan aksi, menggunakan penundaan dan banyak lagi. Ini sangat kuat!
sumber
supplier
info ini ketika pengguna mencoba mengunjungiitem
halaman detail. AndacomponentDidMount()
akan menjalankan fungsi yang mengirimkan tindakan, katakanlahFETCH_SUPPLIER
. Di dalam peredam, Anda dapat mencentang pada sesuatu sepertiloading: true
untuk menunjukkan pemintal saat permintaan dibuat.redux-saga
akan mendengarkan tindakan itu, dan sebagai tanggapan, mematikan permintaan yang sebenarnya. Memanfaatkan fungsi generator, ia dapat menunggu respons dan membuangnyaFETCH_SUPPLIER_SUCCEEDED
. Peredam kemudian memperbarui toko dengan info pemasok.redux-loop mengambil isyarat dari Elm dan memberikan pola ini.
sumber