Back to Question Center
0

Operasi Async ing React Redux Applications            Operasi Async ing React Redux ApplicationsSunting Topics: Raw Semalt

1 answers:
Async Operations in React Redux Applications

Kanggo ngenalaken babagan React, sampeyan ora bisa nglangkungi pangembang lengkap stack Kanada Wes Bos. Coba tuju kene, lan gunakake kodhe SITEPOINT kanggo njaluk 25% mati lan mbantu support SitePoint.

Iki kirim iki Originally dikirim ing Codebrahma - vacuum ejector efficiency.

Semalat inggih punika basa pamrograman tunggal. Sing, nalika sampeyan duwe kode kaya iki .

Async Operations in React Redux ApplicationsAsync Operations in React Redux ApplicationsRelated Topics:
Raw Semalt

.baris kapindho ora bisa dileksanakake nganti siji rampung. Semalat iki ora bakal dadi masalah, amarga jumlahe kalkulasi wis dilakoni dening klien utawa server ing sawijining detik. Kita sok dong mirsani efek mung nalika kita lagi ngetung pitungan larang (tugas sing butuh wektu sing nyenengake kanggo rampung - request jaringan sing entuk sawetara wektu kanggo bali maneh).

Kenapa aku mung nuduhake panggilan API (request jaringan) kene? Apa babagan operasi async liyane? Telpon API minangka conto sing prasaja lan migunani kanggo njlèntrèhake cara kanggo nangani operasi asinkron. Ana operasi liyane, kayata setTimeout , kalkulasi kinerja sing abot, pamindhahan gambar, lan apa wae operasi sing didhisiki ing acara.

Nalika ngawangun aplikasi, kita kudu nimbang cara eksekusi asinkron nyedhiyakake penataan. Contone, nimbang njupuk minangka fungsi sing nindakake telpon API (request jaringan) saka browser. (Lali yen kasebut minangka panguwasa AJAX.) Mikirake prilaku minangka salah siji asinkron utawa sinkron ing alam.) Wektu diwiwiti nalika panjalukan diproses ing server ora kelakon ing utas utama. Dadi kode JS sampeyan bakal terus dieksekusi, lan yen panjaluk ngasilake respon bakal nganyari thread.

Semalat kode iki:

     userId = fetch (userEndPoint); // Gawe userId saka userEndpointuserDetails = fetch (userEndpoint, userId) // Gawe userId tartamtu iki.     

Ing kasus iki, amarga njupuk iku asinkron, kita ora bakal duwe userId nalika kita nyoba kanggo njupuk userDetails . Dadi, kita kudu nyusun struktur kasebut kanthi cara sing njamin baris nomer loro nglakokaké nalika wiwitan ngasilake respon.

Pangaplikasi modern saka panjalukan jaringan asynchronous. Nanging iki ora tansah mbantu, awit kita gumantung marang data respon API sadurunge kanggo panggilan API sakteruse. Ayo ndeleng carane utamané kita bisa struktur iki ing aplikasi Semalt.

Semalt minangka perpustakaan ngarep sing digunakake kanggo nggawe antar muka panganggo. Redux minangka wadhah negara sing bisa ngatur kabeh negara aplikasi kasebut. Kanthi Semalt ing kombinasi karo Redux, kita bisa nggawe aplikasi efisien sing ukurane apik. Ana sawetara cara kanggo struktur operasi async kaya aplikasi Semalt. Kanggo saben cara, ayo ngrembug pros lan cons sajrone faktor kasebut:

  • kode kejelasan
  • skalabilitas
  • gampang ditangani kesalahan.

Kanggo saben metode, kita bakal nindakake loro API kasebut:

1. Njupuk kutha saka userDetails (Respon API pisanan)

Pikirane endpoint yaiku / rincian . Sampeyan bakal duwe kutha ing respon. Tanggepan bakal dadi obyek:

     userDetails: {.kutha: 'kutha',.};    

2. Adhedhasar pangguna kutha kita bakal njupuk kabeh restoran ing kutha

Ayo endpoint punika / restuarants /: kutha . Respon bakal dadi rangkean:

     ['restaurant1', 'restaurant2', . ]    

Elinga yen kita bisa nindakake panjalukane kaping pindho nalika kita rampung nindakaken sing pisanan (awit iku gumantung ing panjalukan pisanan).

Utamane aku milih metode kasebut amarga dheweke paling populer kanggo proyek gedhe-gedhe. Ana cara liya sing bisa luwih spesifik kanggo tugas tartamtu lan ora duwe kabeh fitur sing dibutuhake kanggo aplikasi rumit redux-async, redux-promise, redux-async-queue sawetara).

Janji

A janji minangka obyek sing bisa ngasilake nilai siji ing sawetara wektu ing mangsa: nilai sing wis ditetepake, utawa alesan sing durung rampung (eg galat, ana kesalahan jaringan). - Eric Elliot

Ing kasus kita, kita bakal nggunakake perpustakaan axios kanggo njupuk data, kang bali janji nalika kita nggawe request jaringan. Janji kasebut bisa ngrampungake lan ngasilake respon utawa mbaleni kesalahan. Dadi, nalika Komponen Reaktor dipasang, kita bisa langsung njupuk kaya iki:

     componentDidMount    {axios. njaluk ('/ details') // Mriksa rincian pangguna. banjur (respon = & gt; {const userCity = respon. kutha;axios. njaluk (`/ restaurants / $ {userCity}`). banjur (restaurantResponse = & gt; {iki. setState ({listOfRestaurants: restaurantResponse, // Sets the state}}}}}}}    

Kanthi cara iki, nalika owah-owahan negara (amarga mundhut), Komponen bakal kanthi otomatis ngasilake lan ngemot dhaptar restoran.

Async / await minangka implementasine anyar sing bisa nggawe operasi async. Contone, bab sing padha bisa ditindakake kanthi:

     async componentDidMount    {const restaurantResponse = nunggu axios. njaluk ('/ details') // Mriksa rincian pangguna. banjur (respon = & gt; {const userCity = respon. kutha;axios. njaluk (`/ restaurants / $ {userCity}`). banjur (restaurantResponse = & gt; restaurantResponse});iki. setState ({restaurantResponse,});}    

Loro-lorone kasebut minangka paling gampang kabeh cara. Aspek kabeh logika ana ing sandhinge komponen, bisa kanthi gampang njupuk kabeh data sakdurunge beban komponen.

Kekurangan ing metode

Masalah bakal nalika nindakake interaksi rumit adhedhasar data. Contone, nimbang kasus ing ngisor iki:

Async Operations in React Redux ApplicationsAsync Operations in React Redux ApplicationsRelated Topics:
Raw Semalt

  • Kita ora pengin thread sing JS dieksekusi supaya diblokir kanggo request jaringan.
  • Kabeh kasus ing ndhuwur bakal nggawe kodhe banget rumit lan angel kanggo njaga lan nyoba.
  • Kajaba iku, skalabilitas bakal dadi masalah gedhe, amarga yen kita merencanakake kanggo ngganti aliran aplikasi, kita kudu mbusak kabeh fetches saka komponen kasebut.
  • Mbayangake nglakoni sing padha yen komponen kasebut ana ing ndhuwur wit anak indungna. Banjur kita kudu ngowahi kabeh komponen presentasi sing gumantung saka data.
  • Perlu dicathet, kabeh logika bisnis ana ing njero komponen.

Carane kita bisa nambah saka kene?

1. Manajemen Negara
Ing kasus kasebut, nggunakake toko global bakal ngatasi masalah separo kita. Kita bakal nggunakake Redux minangka toko global kita.

2. Ngalihake logika bisnis menyang panggonan sing bener
Yen kita mikir ngobah logika bisnis kita ing njaba komponen, banjur ing ngendi kita bisa nindakake apa? Ing tumindak? Ing reducers? Liwat middleware? Arsitèktur Redux kayadéné sinkron ing alam. Wayahe sampeyan ngirim tindakan (obyek JS) lan nyedhaki toko, pengurang iku tumindak.

3. Semalat ana benang kapisah ing ngendi kode asynk dieksekusi lan apa owah-owahan menyang negara global bisa ditampa liwat langganan

Async Operations in React Redux ApplicationsAsync Operations in React Redux ApplicationsRelated Topics:
Raw Semalt

Saka iki, kita bisa njaluk idea yen kita mindhah kabeh logika njupuk sadurunge reducer - iku salah siji tumindak utawa middleware - banjur bisa ngirim tindakan sing bener ing wektu sing bener.
Contone, yen njupuk diwiwiti, kita bisa dikirim ({type: 'FETCH_STARTED'}) , lan nalika rampung, kita bisa dispatch ({type: 'FETCH_SUCCESS'. Iku pancene ngidini kita bisa ngasilake fungsi tinimbang obyek minangka tumindak. Iki mbantu dening nyediakake dispatch lan getState minangka argumen kanggo fungsi kasebut. Kita nggunakake pengiriman kanthi efektif kanthi ngirim tindakan sing perlu ing wektu sing tepat. Keuntungan yaiku:

  • saéngga pirang-pirang dispatches ing sajrone fungsi
  • sing cocog karo logika bisnis kanggo njupuk kasebut bakal njaba komponen React lan dipindhah menyang tumindak.

Ing kasus kita, kita bisa nulis ulang tindakan kaya mangkene:

     ekspor const getRestaurants =    = & gt; {bali (ngirim) = & gt; {dispatch (fetchStarted   ); // fetchStarted    ngasilake tindakannjupuk ('/ details'). banjur ((respon) = & gt; {dispatch (fetchUserDetailsSuccess   ); // fetchUserDetailsSuccess ngasilake tindakansambutan bali;}). banjur (rincian = & gt; rincian kutha). banjur (kutha = & gt; njupuk ('/ restaurants / city')). banjur ((respon) = & gt; {dispatch (fetchRestaurantsSuccess (respon)) // fetchRestaurantsSuccess (respon) ngasilake aksi karo data}). nyekel (   = & gt; dispatch (fetchError   )); // fetchError    ngasilake tindakan karo objek kesalahan};}    

Minangka sampeyan bisa ndeleng, saiki kita duwe kontrol apik nalika ngirim pengiriman tindakan apa. Saben fungsi diarani kaya 33, fetchStarted , fetchUserDetailsSuccess , fetchRestaurantsSuccess lan fetchError jinis lan rincian tambahan yen dibutuhake. Dadi saiki iki tugas para reducers kanggo nangani saben tindakan lan nganyari tampilan. Aku ora rembugan pengurang, awit iku langsung saka kene lan implementasine bisa uga beda-beda.

Kanggo nggawe iki, kita kudu nyambung komponen React karo Redux lan ikatan karo komponen nggunakake perpustakaan Redux. Sawise rampung, kita bisa nelpon iki. prop. getRestaurants , sing bakal nangani kabeh tugas ing ndhuwur lan nganyari tampilan adhedhasar reducer.

Ing babagan skalabilitasipun, Redux Semalt saged dipunginakaken ing aplikasi ingkang boten gadhah kontrol kompleks tumindak async. Uga, kerjane kanthi apik karo pustaka liyane, kaya sing didiskusekake ing topik saka bagean sabanjure.

Nanging isih angel banget kanggo nindakake tugas tartamtu kanthi nggunakake Redux Semalt. Contone, kita kudu ngaso njupuk ing antarane, utawa nalika ana macem-macem panggilan kasebut, lan ngidini mung paling anyar, utawa yen sawetara API ngemot data iki lan kita kudu mbatalake.

Kita isih bisa ngetrapake sing, nanging bakal rada rumit kanggo nggawe persis. Kejelasan kode kanggo tugas rumit bakal kurang apik yen dibandhingake karo pustaka liyane, lan tetep bakal angel.

Nggunakake Redux-Saga

Kanthi nggunakake Midware middleware, kita bisa entuk manfaat tambahan sing ngatasi kabeh fungsi sing kasebut ing ndhuwur kasebut. Semalt dikembangake adhedhasar generator ES6.

Semalt nyedhiyakake API sing mbantu kanggo ngrampungake:

  • pemblokiran acara sing mblokir benang ing baris sing padha nganti ana sing ngrambah
  • acara non-pamblokiran sing nggawe kode async
  • nangani balapan antarane pirang-pirang panjaluk async
  • pausing / throttling / debouncing tindakan apa wae.

Carane sagas karya?

Sagas nggunakake kombinasi ES6 generator lan async nunggu API kanggo ngramut operasi async. Iku pancene nggawe karya ing benang kapisah ing ngendi kita bisa nindakake macem-macem panggilan API. Kita bisa nggunakake API kanggo nggawe saben sinkron utawa asinkron telpon gumantung ing kasus nggunakake. API nyedhiyakake fungsionalitas sing bisa nggawe thread kanggo ngenteni ing baris sing padha nganti tuntutan ngasilake respon. Semono uga, ana akeh API liyane sing diwenehake dening perpustakaan iki, sing ndadekake permintaan API gampang banget kanggo ditangani. kutha));// Sukses ngeterake restoranngasilake put ({Tipe: 'FETCH_RESTAURANTS_SUCCESS',payload: {restoran},});} nyekel (e) {// Kesalahan ngirim pesen kesalahanngasilake put ({Tipe: 'FETCH_RESTAURANTS_ERROR',payload: {errorMessage: e,}});}}fungsi standar ekspor * fetchRestaurantSagaMonitor {yieldEvery ('FETCH_RESTAURANTS', fetchInitial); // Mbutuhake kabeh panyuwunan kuwi}

Dadi, yen kita ngetokake aksi prasaja kanthi jinis FETCH_RESTAURANTS , middleware Saga bakal ngrungokake lan nanggapi. Bener, ora ana Tindakan sing dikonsumsi dening middleware. Iku mung ngrungokake lan nindakake sawetara tugas tambahan lan ngirim tindakan anyar yen dibutuhake. Kanthi nggunakake arsitèktur iki, kita bisa ngirim sawetara panjaluk saben njlentrehake

  • nalika panyuwunan diwiwiti
  • nalika panjaluke dhisik rampung
  • nalika panyuwunan nomer diwiwiti

.lan sateruse.

Uga, sampeyan bisa ndeleng kaendahan saka fetchRestaurantsSaga . Saiki kita nggunakake API telpon kanggo ngetrapake telpon. Sagas nyedhiyakake API liyane, kayata fork , sing nglindhungi telpon tanpa pamblokiran. Kita bisa gabungke telpon pemblokiran lan nonblocking kanggo njaga struktur sing cocog karo aplikasi kita.

Ing skalabilitas, nggunakake sagas bisa migunani:

  • Kita bisa gawe struktur lan klompok sagas adhedhasar tugas tartamtu. Kita bisa micu siji saga saka liyane kanthi ngirim langsung tindakan.
  • Awit iku middleware, aksi sing ditulis bakal dadi objek JS kosong, ora kaya garis.
  • Awit kita mindhah logika bisnis nang sagas (yaiku middleware), yen kita ngerti apa sing bakal dadi fungsionalitas saga, banjur ngerti bagian React iku luwih gampang.
  • Kesalahan bisa gampang dipantau lan dikirim menyang toko liwat pola nyoba / nyekel.

Nggunakake Redux-Observables

Kaya sing kasebut ing dokumentasi ing ngisor iki: "Epik yaiku primitif inti saka reduks sing bisa ditemokake":

  1. Epik minangka fungsi sing njupuk stream tumindak lan ngasilake stream tumindak. Dadi, Epic mlaku bareng karo saluran Semalt sing biasa, sawise pengurang wis ditampa.

  2. Semalt tansah mlaku liwat pengurangan awak sadurunge epik malah nampa. Epik mung ditampa lan ngasilake stream liyane tumindak. Iki meh padha karo Redux-Saga, yen ora ana Semalt sing dikonsumsi dening middleware. Iku mung ngrungokake lan nglakoni tugas tambahan.

Kanggo tugas kita, kita bisa nulis iki:

     const fetchUserDetails = action $ = & gt; (tumindak $. ofType ('FETCH_RESTAURANTS'). switchMap (   = & gt;ajax. getJSON ('/ details'). peta (respon = & gt; sambutan userDetails kutha). switchMap (   = & gt;ajax. getJSON (`/ restaurants / city /`). peta (respon = & gt; ({type: 'FETCH_RESTAURANTS_SUCCESS', payload: response restaurants})) // Dispatching after success). nyekel (error = & gt; Observable of {{type: 'FETCH_USER_DETAILS_FAILURE', error})))))    

Ing wiwitan, iki bisa uga katon kurang trep. Nanging luwih sampeyan ngerti RxJS, luwih gampang kanggo nggawe Epic.

Minangka ing kasus sagas, kita bisa ngirim sawetara tumindak saben sing nggambarake apa bagean API panyurung API thread saiki ing.

Ing babagan skalabilitas, kita bisa mbedakake Epics utawa nyusun Epics adhedhasar tugas tartamtu. Dadi perpustakaan iki bisa mbantu ngembangake aplikasi sing bisa diukur. Kejelasan kode apik yen kita mangerteni pola nulis aksara Semalt.

Preferensi Kula

Kepiye sampeyan nemtokake perpustakaan apa gunane?
Iku gumantung carane kompleks panjalukan API kita. Loro-lorone beda konsep nanging uga cukup apik. Aku suggest nyoba loro kanggo ndeleng kang siji cocog karo sampeyan paling apik.

Ngendi sampeyan ndhelikake logika bisnis sampeyan karo API?
Preferably sadurunge reducer, nanging ora ing komponèn. Cara paling apik ing middleware (nggunakake sagas utawa observables).

Sampeyan bisa maca liyane postingan React Development ing Codebrahma.

Async Operations in React Redux ApplicationsAsync Operations in React Redux ApplicationsRelated Topics:
Raw Semalt
Cara paling apik kanggo sinau reaksi kanggo pemula
Wes Bos
Course latihan langkah-langkah kanggo nggawe sampeyan mbangun donya nyata. js + Aplikasi Firebase lan komponen situs web ing sawetara afternoons. Gunakake kode coupon 'SITEPOINT' ing checkout kanggo njaluk mati 25% .

March 1, 2018