Back to Question Center
0

Redux програмыг ажиллуулах асинхрон ажиллагаа            Reynolds Redux програмыг ашигладаг Async OperationsRelated Topics: Raw Semalt

1 answers:
Reux Redux програм дахь асинхрон ажиллагаа

React нь өндөр чанартай, гүнзгий танилцуулга бол, та Канадын бүрэн стек хөгжүүлэгч Wes Bos өнгөрсөн байж чадахгүй. Энд хичээлээ оруулаад SITEPOINT ашиглан 25% off авах ба SitePoint-ийг дэмжихэд туслах болно.

Энэ бичлэгийг анх Codebrahma дээр байрлуулсан.

Semalt бол нэг урсгалтай програмчлалын хэл юм. Өөрөөр хэлбэл та иймэрхүү кодтой бол .

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

.хоёр дахь мөр нь эхнийх нь дуусах хүртлээ гүйцэтгэгддэггүй. Сая сая тооцооллыг клиент эсвэл сервер секундын хугацаанд гүйцэтгэдэг тул энэ нь асуудал болохгүй. Бид үр ашгаа тооцохдоо зардлаа (зардлыг дуусгахад мэдэгдэхүйц хугацаа шаардагддаг) - үр дүнд нь буцааж өгөхийг шаарддаг.

Яагаад би зөвхөн API дуудлага (сүлжээний хүсэлтийг) харуулав? Асинхний бусад үйл ажиллагаа гэж юу вэ? API дуудлага нь асинхрон ажиллагааг хэрхэн зохицуулах талаар тайлбарлахад маш энгийн, хэрэгтэй жишээ юм. Бусад setTimeout , гүйцэтгэл-хүнд тооцоо, зураг ачаалах болон үйл явдлаас үүдэлтэй үйлдлүүд зэрэг бусад үйлдлүүд байдаг.

Аппликэйшнийг бүтээхдээ асинхрон гүйцэтгэл хэрхэн бүтцийн нөлөөллийг авч үзэх хэрэгтэй. Жишээ нь fetch -ийг хөтөчөөс API дуудлага (сүлжээний хүсэлт) гүйцэтгэх функц гэж үзээрэй. (AJAX хүсэлт байгаа эсэхийг мартахын тулд, зан төлөвийг асинхрон эсвэл синхрон гэж ойлгож болно.) Хүсэлт нь сервер дээр гол thread дээр хийгддэггүй байхад өнгөрөх цаг. Тиймээс таны JS кодыг ажиллуулсаар байх болно, хүсэлтийг буцаагаад тэр хариуг буцааж өгөх болно.

Энэ кодыг унш:

     userId = fetch (userEndPoint); // ХэрэглэгчийнEndpoint-ээс userId-ыг авахuserDetails = fetch (userEndpoint, userId) // Энэ хэрэглэгчийг авах.     

Энэ тохиолдолд fetch нь asynchronous болохоор userDetails -г авахыг оролдоход userId хэрэггүй болно. Тиймээс бид эхний хариултыг буцаах үед хоёр дахь мөрөнд гүйцэтгэх боломжийг олгодог.

Сүлжээний хүсэлтийн ихэнх орчин үеийн шийдлүүд нь асинхрон юм. Гэхдээ энэ нь үргэлж тусалдаггүй бөгөөд бид дараагийн API дуудлагуудад өмнөх API-ийн хариу өгөгдөлээс хамаардаг. Semtalt програмуудад үүнийг хэрхэн бүтээх талаар авч үзье.

Semalt бол хэрэглэгчийн интерфэйсийг гаргахад хэрэглэгддэг урд талын төгсгөлийн сан юм. Redux нь програмын бүх төлвийг удирдах чадвартай мужааны контейнер юм. Semtalt нь Redux-тэй хослуулан бид сайн үр дүнтэй хэрэглээг бий болгож чадна. Semalt програмыг асинхрон үйл ажиллагааг зохион байгуулах хэд хэдэн арга байдаг. Арга тус бүрийн хувьд эдгээр хүчин зүйлстэй холбоотой давуу болон сул талуудыг авч үзье.

  • код тодорхой
  • өргөтгөх
  • алдаатай харьцах.

Арга тус бүрийн хувьд бид эдгээр хоёр API дуудлагыг гүйцэтгэнэ:

1. Fetching city from userDetails (First API response)

Төгсгөлийн цэгийг / нарийвчлал гэж үзье . Энэ нь хотод хариу өгөх болно. Хариулт нь объект болно:

     userDetails: {.хот: 'хот',.};    

2. Хэрэглэгч хот дээр тулгуурлан бид бүх 17 (хот)

Төгсгөлийн цэг бол / restuarants /: хот гэж үзье. Хариу нь массив байх болно:

     ['restaurant1', 'restaurant2', . ]    

Бид хоёр дахь хүсэлтийг эхний удаа хийж дуусаад (анхны хүсэлтээс хамааралтай учраас).

Ялангуяа би эдгээр аргыг сонгосон. Учир нь тэдгээр нь том хэмжээний төслийн хувьд хамгийн түгээмэл хэрэглэгддэг. Тодорхой ажлуудад илүү нарийвчилсан байж болох бөгөөд цогц програмыг redux-async, redux-promise, redux-async-queue -д шаардагдах бүх боломжууд байхгүй байна. цөөхөн).

Амлалтууд

Амлалт гэдэг нь ирээдүйд тодорхой нэг утга үүсгэх обьект юм: тодорхойлогдсон утга, эсвэл шийдэгдээгүй шалтгаан (жишээ нь, сүлжээний алдаа гарсан). - Эрик Эллиот

Бидний тохиолдолд бид сүлжээний хүсэлт гаргахдаа амлалтаа буцааж өгч өгөгдлийг авахын тулд аксиос санг ашиглах болно. Энэ амлалт хариу хариу өгч, буцааж өгч болох юм. Тэгэхээр, React Component холболтуудыг хийсний дараа бид иймэрхүүгээр мэдэгдэж чадна:

     componentDidMount    {axios. get ('/ details') // Хэрэглэгчийн мэдээллийг авах. (хариулт = & gt; {const хэрэглэгчийн = хариулт. хот;axios. get (`/ restaurants / $ {userCity}`). Дараа нь (restaurantResponse = & gt; {энэ нь. setState ({listOfRestaurants: restaurantResponse, // state sets})})})}    

Техех еерчлегдеж байгаа энэ тохиолдолд компонент рестораны жагсаалтыг автоматаар дахин уншиж, ачаалах болно.

Async / await нь хэрэгжүүлэлтэд хэрэглэгддэг шинэ хэрэгжүүлэлт юм. Жишээ нь, үүнтэй ижил зүйлийг хийж болно:

     async componentDidMount    {const restaurantResponse = axios хүлээнэ. get ('/ details') // Хэрэглэгчийн мэдээллийг авах. (хариулт = & gt; {const хэрэглэгчийн = хариулт. хот;axios. get (`/ restaurants / $ {userCity}`). Дараа нь (restaurantResponse = & gt; restaurantResponse});энэ нь. setState ({restaurantResponse,});}    

Эдгээр нь хоёулаа хамгийн энгийн арга юм. Бүхэл бүтэн логикийг бүрэлдэхүүн хэсгүүдийн дотор оруулж, бүрэлдэхүүнийг ачаалах үед бүх өгөгдлийг хялбархан авч болно.

Арга барил дахь сул тал

Өгөгдөл дээр тулгуурласан цогц харилцан үйлдэл хийхэд асуудал нь байх болно. Жишээ нь, дараах тохиолдлыг авч үзье:

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

  • Сүлжээний хүсэлтийг гүйцэтгэхийн тулд JS-г ажиллуулах threadыг бид хүсэхгүй байна.
  • Дээрх бүх тохиолдлууд нь кодыг маш нарийн төвөгтэй, хадгалах, туршихад хүндрэл учруулна.
  • Мөн түүнчлэн програмын урсгалын өөрчлөлтийг өөрчлөхээр төлөвлөж байгаа бол бүрэлдэхүүн хэсгээс цуглуулсан бүх мэдээллийг устгах шаардлагатай болно.
  • Эцэг эх хүүхдийн модны орой дээр байгаа хэсэг нь ижил байвал төсөөл. Дараа нь бид бүх өгөгдлүүдээс хараат байдалтай хэсгүүдийг өөрчлөх хэрэгтэй.
  • Мөн бизнесийн бүх логик нь бүрэлдэхүүн хэсэг дотор байна.

Эндээс яаж сайжруулах вэ?

1. Төрийн удирдлага
Эдгээр тохиолдлуудад дэлхийн дэлгүүрийн ашиглалтыг ашиглан бидний асуудлын тэн хагасыг шийдэх болно. Бид Redux-ийг дэлхийн дэлгүүр гэж үзэх болно.

2. Бизнесийн логикийг өөрчлөх
Хэрэв бид компанийхаа гадна талаас бизнесийн логикийг хөдөлгөж байгаа гэж бодож байгаа бол бид үүнийг яг хаана хийж чадах вэ? Үйлдлүүд үү? Дамжуулагчид? Дундажаар дамжуулан? Redux-ийн архитектур нь энэ нь синхрон шинж чанар юм. Үйлдлийн (JS объект) илгээж байх үед энэ нь дэлгүүрт хүрч очино.

3. Async кодыг хэрэгжүүлдэг, олон улсын төлөвт орсон өөрчлөлтийг захиалж авч болно.

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

Үүнээс бид хэрэв бид бүх логикийг татаж авахаас өмнө логикийг татаж авах юм бол энэ нь үйлдэл эсвэл middleware юм. Тэгвэл зөв үйлдлийг зөв цагт нь илгээх боломжтой байх болно.
Жишээ нь, fetch эхэлсний дараа илгээх ({type: 'FETCH_STARTED'}) илгээж болох бөгөөд бид дуусах үедээ илгээж болно ({type: 'FETCH_SUCCESS'. Энэ нь үндсэндээ объект үйлдлийг гүйцэтгэхийн оронд функц буцаах боломжийг бидэнд олгодог. Энэ нь илгээх ба getState функцын хувьд нэмэлт өгөгдлөөр хангадаг. Шаардлагатай үйлдлийг зөв цагт нь хүргэж өгөх замаар диспетчерийн мэдээллийг үр дүнтэй ашиглах болно. Үр ашиг нь:

  • функц дотор олон тооны дамжуулалтыг зөвшөөрөх
  • нь бизнесийн логикийг татаж авахад хамаарах үйлдэл нь React-ийн бүрэлдэхүүн хэсгүүдээс гадна, үйлдэл рүү шилжих болно.

Бидний хувьд бид иймэрхүү үйлдлийг дахин хийж болно:

     export const getRestaurants =    = & gt; {буцах (илгээмж) = & gt; {илгээлт (fetchStarted   ); // fetchStarted    нь үйлдлийг буцаанаfetch ('/ details'). Дараа нь ((хариулт) = & gt; {илгээлт (fetchUserDetailsSuccess   ); // fetchUserDetailsSuccess нь үйлдлийг буцаанахариултын хариу;}). Дараа нь (дэлгэрэнгүй = & gt; дэлгэрэнгүйг хот). (хот = & gt; fetch ('/ ресторан / хот)). Дараа нь ((хариулт) = & gt; {илгээгч (fetchRestaurantsSccess (хариулт)) // fetchRestaurantsSuccess (хариулт) нь өгөгдөлтэй үйлдлийг буцаах}). catch (   = & gt; dispatch (fetchError   )); // fetchError    алдаатай объект бүхий үйлдлийг буцаадаг};}    

Мэдээжийн хэрэг, бид хэзээ мэдэгдэл ямар төрлийн үйлдэл хийхээ сайн хянах боломжтой болсон. FetchRestaurantsSuccess ба fetchError нь энгийн JavaScript обьектыг илгээдэг fetchStarted , fetchStarted шаардлагатай бол төрөл, нэмэлт мэдээлэл. Тиймээс одоо үйлдэл бүрийг зохицуулж, үзэл бодлыг нь шинэчлээрэй. Би энэ бууруулагчийн талаар яриагүй, учир нь эндээс шууд шуудхан, хэрэгжилт нь янз бүр байж болно.

Энэ нь ажиллахын тулд бид React компонентыг Redux ашиглан холбох хэрэгтэй. Үүнийг хийсний дараа бид зүгээр л руу залгаж болно. тулгуур. getRestaurants , энэ нь эргээд дээрх бүх ажлуудыг хийх бөгөөд багасгагч дээр суурилсан үзлийг шинэчлэх болно.

Өргөтгөх чадвараараа Redux Semaltыг async үйлдлийн талаархи цогц хяналтуудыг агуулдаггүй апп дээр ашиглагдаж болох юм. Мөн энэ нь дараагийн хэсэгт байгаа сэдвээр хэлэлцэгдсэний үндсэн дээр бусад номын сантай хамтарч ажилладаг.

Гэсэн хэдий ч, Redux Semalt-ийг ашиглан тодорхой ажлуудыг хийхэд бага зэрэг хэцүү байдаг. Жишээлбэл, бид дуудлага хийхийг түр зогсоох, эсвэл ийм олон дуудлага хүлээж авах үед түр зогсоох хэрэгтэй бөгөөд зөвхөн хамгийн сүүлийн үеийнхийг зөвшөөрөх эсвэл зарим API энэ өгөгдлийг татан авч бид цуцлах хэрэгтэй болно.

Бид тэдгээрийг хэрэгжүүлж чадна, гэхдээ үүнийг хийхэд тийм ч төвөгтэй биш болно. Бусад номын сангуудтай харьцуулахад нарийн төвөгтэй ажлуудад зориулсан кодын тодруулга нь тийм ч муу биш бөгөөд үүнийг хадгалах нь хэцүү байх болно.

Редүкс-Сага

"Semalt" -ыг ашиглах нь дээр дурдсан ажиллагаануудын ихэнхийг шийдэж болох нэмэлт ашиг тусыг хүртэж болно. Semalt нь ES6 генератор дээр үндэслэн боловсруулагдсан.

Semalt нь API-тэй бөгөөд дараахь зорилгод хүрэхэд тусалдаг:

  • нь нэг мөрөнд thread-ийг хаах үйл явцуудыг хаах
  • кодыг асинхрон болгох
  • async олон хүсэлтүүдийн хоорондох тэмцээн
  • ямар нэгэн үйлдэл хийхээ больсон.

Агнас хэрхэн ажилладаг вэ?

Sagas нь ES6 генераторуудын хослолыг ашигладаг ба async нь API асинхрон үйл ажиллагааг хялбаршуулахыг хүлээнэ. Энэ нь олон төрлийн API дуудлага хийж чадах тусдаа утас дээр ажилладаг. Хэрэглээний нөхцөл байдлаас шалтгаалан дуудлага бүрийг синхрон эсвэл асинхрон дуудах API ашиглана. API нь хүсэлтийг хариу өгч дуустал нэг мөрөнд хүлээх боломжтой болгодог. Үүнээс үүдээд энэ номын сангаас үзүүлдэг бусад API-ууд их байдаг бөгөөд энэ нь API хүсэлтийг зохицуулахад хялбар байдаг. хот));// Амжилтанд хүрэхийн тулд ресторануудаа амжилттай явуулах болногарц ({төрөл: 'FETCH_RESTAURANTS_SUCCESS',төлбөрийн хэмжээ: {зоогийн газар},});} catch (e) {// Алдааны тухай алдааны мэдээг илгээдэггарц ({төрөл: 'FETCH_RESTAURANTS_ERROR',төлбөрийн хэмжээ: {errorMessage: e,}});}}экспортын үндсэн функц * fetchRestaurantSagaMonitor {Гарц авах ('FETCH_RESTAURANTS', fetchInitial); // ийм хүсэлтийг авах}

Хэрвээ бид FETCH_RESTAURANTS төрөлтэй энгийн үйлдлийг илгээвэл, Saga програм хангамжийг сонсож, хариу өгөх болно. Үнэндээ, эдгээр үйлдлүүд нь дундын хэрэглээг ашигладаггүй. Энэ нь зүгээр л сонсож, зарим нэмэлт үүрэг гүйцэтгэж, шаардлагатай бол шинэ арга хэмжээ авдаг. Энэ архитектурыг ашигласнаар бид олон төрлийн хүсэлтийг илгээж болно

  • эхний хүсэлт ирэхэд
  • эхний хүсэлт дууссан
  • хоёр дахь хүсэлт эхлэхэд

.гэх мэт.

Мөн fetchRestaurantsSaga fetchRestaurantsSaga -ийн гоо сайхныг харж болно. Бид одоогоор хаалттай дуудлагыг хэрэгжүүлэх дуудлага API-г хэрэглэж байна. Sagas нь хаалтгүй дуудлагыг хэрэгжүүлдэг салаа зэрэг бусад API-үүдийг хангадаг. Бид програмыг тохирох бүтцийг хадгалахын тулд хаах болон блоклох дуудлагыг хослуулан хэрэглэж болно.

Хамаарах чадварын хувьд sagas ашиглах нь ашигтай:

  • Бид ямар нэгэн тодорхой үүрэгт тулгуурлан багануудыг бүтээж, бүлэглэж болно. Бид үйлдлийг илгээж, нэг агшинг өөрөөс нь гаргаж болно.
  • Энэ нь middleware тул бидний бичих үйлдлүүд энгийн JS объект байх болно, цоорхойтой адил.
  • Бид саадыг (дундаж байгаа) бизнес логикийг шилжүүлснээр, хэрэв бид егсен функц ямар байхыг мэддэг бол React-ийн хэсгийг ойлгох нь илүү хялбар болно.
  • Алдааг алдааг шалгаж, оролдож үзээрэй.

Редакцийн ажиглагчдыг ашиглах

Тэдгээр баримт бичигт дурьдсанчлан "Тулгууртнууд нь ажиглагдаж болохуйц"

  1. Epic нь үйл ажиллагааны урсгалыг авч, үйл ажиллагааны урсгалыг буцаана. Энэ бол Эпиптүүд семальт дамжуулалтын сувагтай зэрэгцэн ажиллаж, бууруулагчдыг аль хэдийн хүлээн авсны дараа ажиллуулдаг.

  2. Semaltтууд ч гэсэн эш үзүүрүүдийг хүлээн авахаасаа өмнө чиний бууруулагчид үргэлж давтдаг. Epic нь өөр нэг урсгалыг гарган авч гардаг. Энэ нь Redux-Сагатай төстэй бөгөөд Semalt-ийн алинд нь ч хэрэглэдэггүй. Энэ нь дөнгөж сонсож, зарим нэмэлт үүрэг гүйцэтгэдэг.

Бидний ажилд зориулж бид үүнийг бичиж болно:

     const fetchUserDetails = action $ = & gt; ($ үйлдэл. ofType ('FETCH_RESTAURANTS'). switchMap (   = & gt;ajax. getJSON ('/ details'). газрын зураг (хариулт = & gt; хариулт. userDetails хот). switchMap (   = & gt;ajax. getJSON (`/ restaurants / хот /`). газрын зураг (хариулт = & gt; ({type: 'FETCH_RESTAURANTS_SUCCESS', төлбөрийн: хариулт.). catch (алдаа = & gt; ({type: 'FETCH_USER_DETAILS_FAILURE', error})))))    

Эхлээд энэ нь бага зэрэг төөрөлдөх шиг харагдаж болно. Гэхдээ та RxJS-ийг илүү ойлгодог бол Epic-ийг бүтээх нь хялбар байдаг.

Системийн хувьд бид API хүсэлтийн гинжин хэлхээний яг одоо байгаа thread-ийн аль хэсэгт тодорхойлсон олон үйлдлийг бид илгээж чадна.

Өргөн цар хүрээний хувьд бид Эпиксийг хувааж эсвэл Эптикийг тодорхой ажлуудад тулгуурлан бичиж болно. Энэ номын сан нь өргөтгөх боломжтой програмуудыг бий болгоход туслах болно. Кодын кодын Semalt загварыг ойлгох бол кодын тодруулга сайн байна.

Миний сонголт

Та аль номын санг хэрхэн ашигладаг вэ?
Энэ нь манай API хүсэлтийг хэр төвөгтэй байдгаас хамаарна. Аль аль нь өөр өөр үзэл санаа боловч хангалттай сайн. Би аль аль нь хамгийн сайн тохирохыг харахыг аль аль талдаа оролдоорой.

Та API лицензтэй холбоотой бизнесийн логикийг хаана хадгалж байдаг вэ?
Дахин багасгахаас өмнө бүрэлдэхүүн хэсэг биш юм. Шилдэг арга нь дундуур (sagas эсвэл ажиглалтын хэрэглээ ашиглан) байх болно.

Та Codebrahma-д илүү React Хөгжлийн бичлэгийг уншиж болно.

Async Operations in React Redux ApplicationsAsync Operations in React Redux ApplicationsRelated Topics:
Raw Semalt
Суралцах хамгийн сайн замыг эхлэгчдэд үзүүлэх
Wes Bos
Бодит ертөнцийг бүтээхэд чиглэсэн алхам алхмаар сургалт явуулдаг. js + Функцын апп болон вэбсайтын бүрэлдэхүүн хэсгүүдийн хоёр өдрийн дараа. Купоны код 'SITEPOINT' -ийг татаж авахдаа унтраах 25% авах Source .

March 1, 2018