Back to Question Center
0

Operasi Async dalam Aplikasi Redux React            Async Operations in React Redux ApplicationsRelated Topics: Raw Semalt

1 answers:
Operasi Async dalam Aplikasi Redux React

Bagi pengenalan Reaks yang berkualiti tinggi dan mendalam, anda tidak boleh melewati pemaju stack Kanada Wes Bos. Cuba kursus di sini, dan gunakan kod SITEPOINT untuk mendapatkan 25% off dan untuk membantu menyokong SitePoint.

Jawatan ini pada asalnya diposkan di Codebrahma.

Semalt adalah bahasa pengaturcaraan tunggal - iphone 4 lebanon price. Iaitu, apabila anda mempunyai kod sesuatu seperti ini .

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

.baris kedua tidak dapat dilaksanakan sehingga yang pertama selesai. Semalt ini tidak akan menjadi masalah, kerana berjuta-juta perhitungan dilakukan oleh pelanggan atau pelayan dalam satu saat. Kami melihat kesannya hanya apabila kita melakukan pengiraan yang mahal (satu tugas yang mengambil masa yang ketara untuk diselesaikan - permintaan rangkaian yang memakan masa untuk kembali).

Mengapa saya hanya memaparkan panggilan API (permintaan rangkaian) di sini? Bagaimana dengan operasi async lain? Panggilan API adalah contoh yang sangat mudah dan berguna untuk menerangkan cara menangani operasi tak segerak. Terdapat operasi lain, seperti setTimeout , pengiraan berat prestasi, pemuatan imej, dan sebarang operasi yang didorong oleh peristiwa.

Semasa menstrukturkan permohonan kami, kami perlu mempertimbangkan bagaimana pelaksanaan tak segerak mempengaruhi penstrukturan. Sebagai contoh, pertimbangkan ambil sebagai fungsi yang melakukan panggilan API (permintaan rangkaian) dari penyemak imbas. (Lupakan jika ia adalah permintaan AJAX.Hanya memikirkan tingkah laku itu sama ada sebagai asynchronous atau bersifat sinkron.) Masa yang berlalu semasa permintaan diproses pada pelayan tidak berlaku pada thread utama. Jadi kod JS anda akan terus dilaksanakan, dan sekali permintaan itu membalas respons ia akan mengemas kini benang.

Semalat kod ini:

  userId = mengambil (userEndPoint); // Ambil userId dari penggunaEpointuserDetails = fetch (userEndpoint, userId) // Fetch for userId tertentu ini.    

Dalam kes ini, kerana mengambil tidak segerak, kita tidak akan mempunyai userId apabila kita cuba mengambil userDetails . Oleh itu, kita perlu menyusunnya dengan cara yang memastikan garisan kedua dilaksanakan hanya apabila yang pertama mengembalikan respons.

Kebanyakan pelaksanaan moden permintaan rangkaian tidak segerak. Tetapi ini tidak selalu membantu, kerana kami bergantung pada data tindak balas API sebelumnya untuk panggilan API seterusnya. Mari kita lihat sejauh mana kita boleh menyusunnya dalam aplikasi Semalt.

Semalt adalah perpustakaan depan yang digunakan untuk membuat antara muka pengguna. Redux adalah bekas negeri yang boleh menguruskan keseluruhan keadaan permohonan. Dengan Semalt dalam kombinasi dengan Redux, kami boleh membuat aplikasi yang cekap dengan skala yang baik. Terdapat beberapa cara untuk membina operasi async dalam aplikasi Semalt semacam itu. Untuk setiap kaedah, mari bincangkan kebaikan dan keburukan yang berkaitan dengan faktor-faktor ini:

  • kejelasan kod
  • skalabilitas
  • kemudahan pengendalian ralat.

Bagi setiap kaedah, kami akan melaksanakan kedua-dua panggilan API ini:

1. Mengambil bandar daripada userDetails (Respons API pertama)

Mari kita anggap titik akhir adalah / butiran . Ia akan mempunyai bandar dalam jawapannya. Maklum balas akan menjadi objek:

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

2. Berdasarkan pengguna bandar , kami akan mengambil semua restoran di bandar

Katakan titik akhir adalah / restuarants /: bandar . Sambutan akan menjadi pelbagai:

  ['restaurant1', 'restaurant2', . ]   

Ingat bahawa kita boleh melakukan permintaan kedua hanya apabila kita selesai melakukan yang pertama (kerana ia bergantung kepada permintaan pertama).

Terutama saya telah memilih kaedah di atas kerana mereka yang paling banyak digunakan untuk projek besar-besaran. Masih ada kaedah lain yang boleh menjadi lebih spesifik untuk tugas-tugas tertentu dan yang tidak mempunyai semua ciri yang diperlukan untuk aplikasi rumit redux-async, janji reduks, redux-async-queue untuk menamakan beberapa).

Janji

Janji adalah objek yang boleh menghasilkan satu nilai pada masa akan datang: sama ada nilai yang diselesaikan, atau sebab ia tidak dapat diselesaikan (g., Ralat rangkaian berlaku). - Eric Elliot

Dalam kes kami, kami akan menggunakan perpustakaan axios untuk mengambil data, yang mengembalikan janji apabila kami membuat permintaan rangkaian. Janji itu dapat menyelesaikan dan membalas respons atau membuang kesilapan. Jadi, sebaik sahaja Komponen Reaktor melancarkan, kita boleh terus mengambil seperti ini:

  componentDidMount    {axios. dapatkan ('/ details') // Dapatkan butiran pengguna. kemudian (respons = & gt; {const userCity = tindak balas. bandar;axios. dapatkan (`/ restaurants / $ {userCity}`). kemudian (restaurantResponse = & gt; {ini. setState ({listOfRestaurants: restaurantResponse, // Set state})})})}   

Dengan cara ini, apabila keadaan berubah (kerana pengambilan), Komponen akan secara automatik membuat semula dan memuatkan senarai restoran.

Async / menunggu adalah pelaksanaan baru yang mana kita boleh membuat operasi async. Sebagai contoh, perkara yang sama dapat dicapai dengan ini:

  komponen asyncDidMount    {const restaurantResponse = menanti axios. dapatkan ('/ details') // Dapatkan butiran pengguna. kemudian (respons = & gt; {const userCity = tindak balas. bandar;axios. dapatkan (`/ restaurants / $ {userCity}`). kemudian (restaurantResponse = & gt; restaurantResponse});ini. setState ({restaurantResponse,});}   

Kedua-duanya adalah yang paling mudah dari semua kaedah. Semalat keseluruhan logik berada di dalam komponen, kita boleh dengan mudah mengambil semua data sebaik komponen komponen itu dimuatkan.

Kelemahan dalam kaedah

Masalahnya adalah ketika melakukan interaksi rumit berdasarkan data. Sebagai contoh, pertimbangkan kes berikut:

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

  • Kami tidak mahu benang di mana JS sedang dilaksanakan untuk disekat untuk permintaan rangkaian.
  • Semua kes di atas akan menjadikan kod itu sangat rumit dan sukar untuk dikekalkan dan diuji.
  • Selain itu, kebolehskalan akan menjadi masalah besar, kerana jika kami merancang untuk menukar aliran aplikasinya, kita perlu mengeluarkan semua hasil dari komponen.
  • Bayangkan melakukan perkara yang sama jika komponen berada di bahagian atas pokok anak induk. Kemudian kita perlu menukar semua komponen presentasi bergantung kepada data.
  • Perlu diingat, keseluruhan logik perniagaan berada di dalam komponen.

Bagaimana kita boleh memperbaiki dari sini?

1. Pengurusan Negeri
Dalam kes ini, menggunakan kedai global sebenarnya akan menyelesaikan separuh daripada masalah kami. Kami akan menggunakan Redux sebagai kedai global kami.

2. Memindahkan logik perniagaan ke tempat yang betul
Jika kita fikir memindahkan logik perniagaan kita di luar komponen, maka di mana kita boleh melakukannya? Dalam tindakan? Dalam reducers? Melalui middleware? Senibina Redux sememangnya bersifat segerak. Apabila anda menghantar tindakan (objek JS) dan ia sampai ke kedai, reducer bertindak ke atasnya.

3. Semalat ada benang berasingan di mana kod async dilaksanakan dan apa-apa perubahan kepada keadaan global boleh diambil melalui langganan

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

Daripada ini, kita boleh mendapatkan idea bahawa jika kita memindahkan semua logik pengambil sebelum reducer - sama ada tindakan atau middleware - maka mungkin untuk mengetepikan tindakan yang betul pada masa yang betul.
Sebagai contoh, sebaik sahaja mengambil bermula, kita boleh dihantar ({jenis: 'FETCH_STARTED'}) dan apabila selesai, kita boleh menghantar ({type: 'FETCH_SUCCESS'}). Ia pada dasarnya membolehkan kita untuk kembali fungsi dan bukannya objek sebagai tindakan. Ini membantu dengan menyediakan penghantaran dan getState sebagai argumen untuk fungsi tersebut. Kami menggunakan penghantaran dengan berkesan dengan menghantar tindakan yang diperlukan pada masa yang sesuai. Faedahnya adalah:

  • membenarkan penghantaran pelbagai di dalam fungsi
  • yang berkaitan dengan logik perniagaan untuk mengambil akan berada di luar komponen React dan dipindahkan ke tindakan.

Dalam kes kita, kita boleh menulis semula tindakan seperti ini:

  const export getRestaurants =    = & gt; {kembali (penghantaran) = & gt; {penghantaran (fetchStarted   ); // fetchStarted    mengembalikan satu tindakanambil ('/ butiran'). maka ((respons) = & gt; {penghantaran (fetchUserDetailsSuccess   ); // fetchUserDetailsSuccess kembali tindakantindak balas balas;}). kemudian (details = & gt; butiran bandar). kemudian (bandar = & gt; ambil ('/ restoran / bandar')). maka ((respons) = & gt; {penghantaran (fetchRestaurantsSuccess (tindak balas)) // fetchRestaurantsSuccess (respons) mengembalikan tindakan dengan data}). tangkapan (   = & gt; penghantaran (fetchError   )); // fetchError    mengembalikan tindakan dengan objek ralat};}   

Seperti yang anda lihat, kami kini mempunyai kawalan yang baik apabila ke penghantaran jenis tindakan apa. Setiap panggilan berfungsi seperti fetchStarted , fetchUserDetailsSuccess , fetchRestaurantsSuccess dan fetchError jenis dan butiran tambahan jika diperlukan. Oleh itu, sekarang tugas reducers untuk mengendalikan setiap tindakan dan mengemaskini pandangan. Saya tidak membincangkan reducer itu, kerana ia langsung dari sini dan pelaksanaan mungkin berbeza-beza.

Untuk ini, kita perlu menyambung komponen React dengan Redux dan mengikat tindakan dengan komponen menggunakan perpustakaan Redux. Apabila ini selesai, kita boleh menghubungi ini. prop. getRestaurants , yang seterusnya akan mengendalikan semua tugas di atas dan mengemaskini pandangan berdasarkan pengurangan.

Dari segi skala, Redux Semalt boleh digunakan dalam aplikasi yang tidak melibatkan kawalan kompleks terhadap tindakan async. Selain itu, ia berfungsi dengan lancar dengan perpustakaan lain, seperti yang dibincangkan dalam topik bahagian seterusnya.

Namun, agak sukar untuk melakukan tugas-tugas tertentu menggunakan Redux Semalt. Sebagai contoh, kita perlu berhenti sebentar di antara, atau apabila terdapat beberapa panggilan sedemikian, dan hanya membenarkan yang terkini, atau jika beberapa API lain mengambil data ini dan kita perlu membatalkannya.

Kita masih boleh melaksanakannya, tetapi ia akan sedikit rumit untuk dilakukan dengan tepat. Kejelasan kod untuk tugas yang rumit akan menjadi kurang baik jika dibandingkan dengan perpustakaan lain, dan mengekalkannya akan menjadi sukar.

Menggunakan Redux-Saga

Menggunakan Midware middleware, kita boleh mendapatkan manfaat tambahan yang menyelesaikan kebanyakan fungsi yang disebutkan di atas. Semalt dibangunkan berdasarkan penjana ES6.

Semalt menyediakan API yang membantu mencapai perkara berikut:

  • menyekat peristiwa yang menyekat thread dalam baris yang sama sehingga sesuatu dicapai
  • peristiwa tidak menghalang yang membuat kod async
  • mengendalikan perlumbaan antara permintaan async berbilang
  • hentikan / mendesak / memungkiri apa-apa tindakan.

Bagaimana kerja sagas?

Sagas menggunakan gabungan penjana ES6 dan async menunggu API untuk memudahkan operasi async. Pada dasarnya ia berfungsi pada thread berasingan di mana kita boleh melakukan pelbagai panggilan API. Kita boleh menggunakan API mereka untuk membuat panggilan setiap segerak atau tidak segerakan bergantung kepada kes penggunaan. API menyediakan fungsi yang membolehkan kita membuat thread untuk menunggu dalam barisan yang sama sehingga permintaan membalas respons. Semalat dari ini, terdapat banyak API lain yang disediakan oleh perpustakaan ini, yang menjadikan permintaan API sangat mudah diatasi. bandar));// Pada keberhasilan menghantar restoranhasil meletakkan ({taip: 'FETCH_RESTAURANTS_SUCCESS',muatan: {restoran},});} menangkap (e) {/ // Kesalahan menghantar mesej ralathasil meletakkan ({taip: 'FETCH_RESTAURANTS_ERROR',muatan: {errorMessage: e,}});}}fungsi lalai eksport * fetchRestaurantSagaMonitor {hasil takeEvery ('FETCH_RESTAURANTS', fetchInitial); // Mengambil setiap permintaan itu}

Jadi, jika kita menghantar tindakan mudah dengan jenis FETCH_RESTAURANTS , perisian middleware Saga akan mendengar dan menjawab. Sebenarnya, tiada Tindakan diambil oleh middleware. Ia hanya mendengar dan melakukan beberapa tugas tambahan dan menghantar tindakan baru jika diperlukan. Dengan menggunakan seni bina ini, kami boleh menghantar pelbagai permintaan yang masing-masing menerangkan

  • apabila permintaan pertama dimulakan
  • apabila permintaan pertama selesai
  • apabila permintaan kedua bermula

.dan sebagainya.

Juga, anda boleh melihat keindahan fetchRestaurantsSaga . Kami sedang menggunakan API panggilan untuk melaksanakan panggilan menyekat. Sagas menyediakan API lain, seperti fork , yang melaksanakan panggilan tanpa penyekatan. Kami boleh menggabungkan kedua-dua penyekat dan panggilan tanpa blok untuk mengekalkan struktur yang sesuai dengan permohonan kami.

Dari segi skalabiliti, menggunakan sagas adalah berfaedah:

  • Kita boleh struktur dan kumpulan sagas berdasarkan sebarang tugas tertentu. Kita boleh mencetuskan satu saga dari yang lain dengan hanya menghantar satu tindakan.
  • Oleh kerana ia middleware, tindakan yang kita tulis akan menjadi objek JS biasa, tidak seperti thunks.
  • Oleh kerana kita memindahkan logik perniagaan di dalam sagas (iaitu middleware), jika kita tahu apa fungsi fungsinya, maka memahami bahagian React akan lebih mudah.
  • Kesilapan dengan mudah boleh dipantau dan dihantar ke kedai melalui corak cuba / menangkap.

Menggunakan Redux-Observables

Seperti disebutkan dalam dokumentasi mereka di bawah "Satu epik adalah primitif utama redux yang boleh dilihat":

  1. Epik adalah fungsi yang mengambil aliran tindakan dan mengembalikan aliran tindakan. Iaitu, Epic berjalan bersama saluran penghantaran Semalt biasa, selepas pengurangan telah menerima mereka.

  2. Semalt sentiasa berjalan melalui reducers sebelum epik menerimanya. Epik hanya menerima dan mengeluarkan satu lagi aliran tindakan. Ini serupa dengan Redux-Saga, kerana tidak ada Semalt yang dapat dimakan oleh middleware. Ia hanya mendengar dan melakukan beberapa tugas tambahan.

Untuk tugas kami, kita boleh menulis ini:

  const fetchUserDetails = action $ = & gt; (tindakan $. ofType ('FETCH_RESTAURANTS'). switchMap (   = & gt;ajax. getJSON ('/ butiran'). peta (tindak balas = & gt; tindak balas. penggunaDetails bandar). switchMap (   = & gt;ajax. getJSON (`/ restaurants / city /`). peta (respons = & gt; ({type: 'FETCH_RESTAURANTS_SUCCESS', muatan: tindak balas restoran}}) // Pengiriman setelah kejayaan). menangkap (ralat = & gt; Dapat diabaikan ({type: 'FETCH_USER_DETAILS_FAILURE', error})))))   

Pada mulanya, ini mungkin kelihatan sedikit mengelirukan. Tetapi semakin anda memahami RxJS, semakin mudah untuk membuat Epic.

Seperti dalam kes sagas, kita boleh menghantar beberapa tindakan yang masing-masing menerangkan pada bahagian apa rantai permintaan API benang yang sedang ada.

Dari segi skalabilitas, kita dapat membahagikan Epics atau mengarang Epik berdasarkan tugas-tugas tertentu. Oleh itu perpustakaan ini boleh membantu dalam membina aplikasi berskala. Kejelasan kod adalah baik jika kita memahami corak penulisan Semalat.

Keutamaan saya

Bagaimana anda menentukan perpustakaan mana yang hendak digunakan?
Ia bergantung kepada berapa rumit permintaan API kami. Kedua-duanya adalah konsep yang berbeza tetapi sama-sama cukup baik. Saya akan mencadangkan untuk kedua-duanya untuk melihat yang sesuai dengan anda.

Di mana anda menyimpan logik perniagaan anda berurusan dengan API?
Lebih baik sebelum pengurangan, tetapi tidak dalam komponen. Cara terbaik adalah dalam middleware (menggunakan sagas atau diperhatikan).

Anda boleh membaca lebih banyak jawatan Pembangunan React di Codebrahma.

Async Operations in React Redux ApplicationsAsync Operations in React Redux ApplicationsRelated Topics:
Raw Semalt
Cara Terbaik untuk Belajar Reaktif untuk Pemula
Wes Bos
Kursus latihan langkah demi langkah untuk membolehkan anda membina Reaktik dunia sebenar. js + Aplikasi Firebase dan komponen laman web dalam beberapa petang. Gunakan kod kupon 'SITEPOINT' pada checkout untuk mendapatkan 25% off .

March 1, 2018