Back to Question Center
0

عمليات غير المتزامنة في رد فعل تطبيقات ريدوكس            عمليات غير المتزامنة في رد تطبيقات ريدوكس المواضيع ذات الصلة: الخام سيمالت

1 answers:
عمليات أسينك في رد فعل تطبيقات ريدوكس

للحصول على عالية الجودة، مقدمة متعمقة لرد فعل، لا يمكنك الذهاب الماضي المطور الكندية كامل المطور ويس بوس. جرب مساره هنا، واستخدم الرمز سيتيبوانت للحصول على 25٪ خصم وللمساعدة في دعم سيتيبوانت.

وقد نشرت هذه الوظيفة أصلا في كوديبراهما.

سيمالت هي لغة برمجة مترابطة واحدة. وهذا هو، عندما يكون لديك رمز شيء من هذا القبيل - cheap backlinks uk.

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

.السطر الثاني لا يتم تنفيذه حتى يكتمل الأول. سيمالت هذا لن يكون مشكلة، حيث يتم تنفيذ ملايين الحسابات من قبل العميل أو الخادم في الثانية. نلاحظ الآثار فقط عندما نقوم بإجراء حساب مكلفة (مهمة تستغرق وقتا ملحوظا لإكمال - طلب الشبكة الذي يستغرق بعض الوقت للعودة).

لماذا لم أعرض سوى مكالمة أبي (طلب شبكة) هنا؟ ماذا عن العمليات الأخرى غير المتزامنة؟ استدعاء أبي هو مثال بسيط ومفيد جدا لوصف كيفية التعامل مع عملية غير متزامنة. هناك عمليات أخرى، مثل سيتيموت ، الحسابات الثقيلة الأداء، تحميل الصور، وأي عمليات يحركها الحدث.

في حين هيكلة التطبيق لدينا، ونحن بحاجة إلى النظر في كيفية تأثير غير متزامن التنفيذ الهيكلة. على سبيل المثال، تعتبر جلب كدالة تقوم بإجراء استدعاء أبي (طلب شبكة) من المستعرض. (ننسى إذا كان طلب أجاكس فقط التفكير في السلوك إما غير متزامن أو متزامن في الطبيعة). الوقت المنقضي أثناء معالجة الطلب على الملقم لا يحدث على مؤشر الترابط الرئيسي. لذلك سوف يستمر رمز جس الخاص بك الحصول على تنفيذها، وبمجرد أن يرسل الطلب استجابة فإنه سيتم تحديث مؤشر الترابط.

سيمالت هذا الرمز:

     أوسيريد = فيتش (وسيريندبوينت)؛ // فيتش وسريد من وسيريندبوينتوسيرديتايلز = فيتش (وسيريندبوينت، وسيرد) // جلب لهذا أوسيريد معين.     

في هذه الحالة، حيث أن جلب غير متزامن، لن يكون لدينا أوسيريد عندما نحاول جلب وسرديتايلز . لذلك نحن بحاجة إلى هيكله بطريقة تضمن أن السطر الثاني ينفذ فقط عندما يعود الأول استجابة.

معظم التطبيقات الحديثة لطلبات الشبكة غير متزامنة. ولكن هذا لا يساعد دائما، لأننا نعتمد على بيانات الاستجابة أبي السابقة لمكالمات أبي اللاحقة. دعونا ننظر في كيفية خاصة يمكننا أن هيكل هذا في تطبيقات سيمالت.

سيمالت هو مكتبة الأمامية المستخدمة لصنع واجهات المستخدم. ريدوكس هو حاوية الدولة التي يمكن إدارة الدولة بأكملها من التطبيق. مع سيمالت في تركيبة مع ريدوكس، يمكننا أن نجعل التطبيقات الفعالة التي مقياس بشكل جيد. هناك عدة طرق لتنظيم عمليات غير متزامنة في مثل هذا التطبيق سيمالت. لكل طريقة، دعونا نناقش إيجابيات وسلبيات فيما يتعلق بهذه العوامل:

  • وضوح الرمز
  • قابلية
  • سهولة معالجة الأخطاء.

لكل طريقة، سنقوم بتنفيذ هاتين المطلبتين أبي:

1. جلب مدينة من تفاصيل المستخدم (رد أبي الأول)

لنفترض أن نقطة النهاية هي / التفاصيل . وسوف يكون للمدينة في الاستجابة. سيكون الرد كائن:

     وسرديتايلز: {.المدينة: 'المدينة'،.}؛    

2. بناءا على المستخدم مدينة سنقوم بجلب جميع المطاعم في مدينة

لنفترض أن نقطة النهاية هي / ريستوارانتس /: المدينة . ستكون الاستجابة صفيف:

     ['restaurant1'، 'restaurant2'، . ]    

تذكر أننا يمكن أن نفعل الطلب الثاني فقط عندما ننتهي من القيام الأول (لأنه يعتمد على الطلب الأول).

على وجه الخصوص لقد اخترت الطرق المذكورة أعلاه لأنها الأكثر استخداما على نطاق واسع لمشروع واسع النطاق. لا تزال هناك أساليب أخرى يمكن أن تكون أكثر تحديدا لمهام معينة والتي لم يكن لديك كل الميزات المطلوبة لتطبيق معقد ( ريدوكس-أسينك، ريدوكس-وعد، ريدوكس-أسينك-كويو لتسمية قليل).

وعود

الوعد هو كائن قد ينتج قيمة واحدة بعض الوقت في المستقبل: إما قيمة حلها، أو سبب عدم حلها (e. g، حدث خطأ في الشبكة). - اريك اليوت

في حالتنا، سنقوم باستخدام مكتبة أكسيوس لجلب البيانات، التي ترجع وعدا عندما نقوم بإجراء طلب شبكة. هذا الوعد قد يحل ويعيد الاستجابة أو يرمي خطأ. لذلك، بمجرد أن يتفاعل مكون رد ، يمكننا على الفور جلب مثل هذا:

     كومبوننتديدمونت    {أكسيوس. الحصول على ('/ تفاصيل') // الحصول على تفاصيل المستخدم. ثم (ريسبونز = & غ؛ {كونست وسرسيتي = ريسبونز. مدينة؛أكسيوس. الحصول على ( `/ مطاعم / $ {userCity}`). ثم (ريستورانتريسبونز = & غ؛ {هذه. setState ({ليستوفريستورانتس: ريستورانت ريسبونز، // سيتس ذي ستات})})})}    

وبهذه الطريقة، عندما تتغير الدولة (بسبب الجلب)، مكون تلقائيا إعادة تقديم وتحميل قائمة المطاعم.

أسينك / انتظر هو تنفيذ جديد يمكننا أن نجعل عمليات غير متزامنة. على سبيل المثال، يمكن تحقيق الشيء نفسه من خلال هذا:

     أسينك كومبوننتديدمونت    {كونست ريستورانتريسبونز = في انتظار أكسيوس. الحصول على ('/ تفاصيل') // الحصول على تفاصيل المستخدم. ثم (ريسبونز = & غ؛ {كونست وسرسيتي = ريسبونز. مدينة؛أكسيوس. الحصول على ( `/ مطاعم / $ {userCity}`). ثم (ريستورانتريسبونز = & غ؛ ريستورانتريسبونز})؛هذه. setState ({restaurantResponse،})؛}    

كل من هذه هي أبسط من جميع الأساليب. سيمالت المنطق بأكمله هو داخل المكون، يمكننا بسهولة جلب جميع البيانات مرة واحدة الأحمال المكون.

عيوب في الطريقة

وستكون المشكلة عند القيام التفاعلات المعقدة على أساس البيانات. على سبيل المثال، النظر في الحالات التالية:

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

  • نحن لا نريد مؤشر الترابط الذي يتم تنفيذ جس أن يتم حظر طلب الشبكة.
  • جميع الحالات المذكورة أعلاه تجعل من رمز معقدة للغاية وصعبة للحفاظ على واختبار.
  • أيضا، والتدرجية ستكون قضية كبيرة، لأنه إذا كنا نخطط لتغيير تدفق التطبيق، ونحن بحاجة إلى إزالة كل جلب من المكون.
  • تخيل أن تفعل الشيء نفسه إذا كان العنصر هو في الجزء العلوي من شجرة الطفل الأم. ثم نحتاج إلى تغيير جميع المكونات العرضية المعتمدة على البيانات.
  • أيضا أن نلاحظ، منطق الأعمال بأكمله هو داخل المكون.

ما هي افضل دورات التسويق التي يمكن الاستفاده منها بشكل كبير في سوق العمل؟

1 - إدارة الدولة
في هذه الحالات، استخدام متجر عالمي سوف تحل في الواقع نصف مشاكلنا. سنستخدم ريدوكس كمتجرنا العالمي.

2. نقل منطق الأعمال لتصحيح المكان
إذا كنا نفكر في نقل منطق عملنا خارج المكون، ثم أين بالضبط يمكننا أن نفعل ذلك؟ في الإجراءات؟ في المخفضات؟ عبر الوسيطة؟ بنية ريدوكس هي بحيث أنها متزامنة في الطبيعة. لحظة قمت بإرسال عمل (الأشياء جس) ويصل إلى المخزن، المخفض يعمل عليه.

3. سيمالت هناك موضوع منفصل حيث يتم تنفيذ رمز غير متزامن وأي تغيير في الحالة العالمية يمكن استرجاعها من خلال الاشتراك

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

من هذا، يمكننا الحصول على فكرة أنه إذا كنا نقل كل منطق جلب قبل المخفض - وهذا هو إما العمل أو الوسيطة - ثم فمن الممكن لإرسال الإجراء الصحيح في الوقت الصحيح.
على سبيل المثال، بمجرد بدء الجلب، يمكننا الإرسال ({تايب: 'FETCH_STARTED'}) ، وعند اكتماله، يمكننا إيفاد ({تايب: 'FETCH_SUCCESS'}). انها تسمح لنا أساسا للعودة وظيفة بدلا من الكائنات كعمل. وهذا يساعد من خلال توفير إيفاد و جيتستات كما حجج للوظيفة. نحن نستخدم الإرسال بشكل فعال من خلال إيفاد الإجراءات اللازمة في الوقت المناسب. الفوائد هي:

  • مما يسمح بإرسالات متعددة داخل الوظيفة
  • المتعلقة منطق الأعمال لجلب سيكون خارج مكونات رد فعل وانتقل إلى الإجراءات.

في حالتنا، يمكننا إعادة كتابة مثل هذا الإجراء:

     إكسبورت كونست جيتريستورانتس =    = & غ؛ {ريتورن (ديسباتش) = & غ؛ {الإرسال (fetchStarted   )؛ // فيتشستارتد    بإرجاع إجراءجلب ( '/ التفاصيل "). ثم ((رد) = & غ؛ {الإرسال (fetchUserDetailsSuccess   )؛ // فيتشوسيرديتايلزوتشس بإرجاع إجراءعودة الاستجابة؛}). ثم (التفاصيل = & غ؛ تفاصيل المدينة). ثم (سيتي = & غ؛ جلب ('/ المطاعم / المدينة')). ثم ((رد) = & غ؛ {إيفاد (فيتشريستورانتسشوتس (ريسبونز)) // فيتشريستورانتسسوتس (رد) بإرجاع إجراء مع البيانات}). كاتش (   = & غ؛ ديسباتش (فيتشيرور   ))؛ // فيتشيرور    بإرجاع إجراء مع كائن خطأ}؛}    

كما ترون، لدينا الآن مراقبة جيدة من متى ل إيفاد ما هو نوع من العمل. استدعاء كل وظيفة مثل فيتشستارتيد ، فيتشوسرديتايلزوتسشوتس ، فيتشريستورانتسوتسشوتس و فيتشيرور نوع وتفاصيل إضافية إذا لزم الأمر. حتى الآن انها مهمة من المخفضات للتعامل مع كل عمل وتحديث العرض. لم أكن قد ناقشت المخفض، لأنه واضح من هنا وقد يكون التنفيذ متفاوتا.

لهذا العمل، نحن بحاجة إلى توصيل مكون رد مع ريدوكس وربط العمل مع المكون باستخدام مكتبة ريدوكس. وبمجرد الانتهاء من ذلك، يمكننا ببساطة استدعاء هذا. الدعائم. جيترستورانتس ، والتي بدورها سوف التعامل مع جميع المهام المذكورة أعلاه وتحديث وجهة النظر على أساس المخفض.

من حيث قابلية لها، يمكن استخدام ريدوكس سيمالت في التطبيقات التي لا تنطوي على ضوابط معقدة على الإجراءات غير المتزامنة. كما أنه يعمل بسلاسة مع المكتبات الأخرى، كما نوقش في موضوعات القسم التالي.

ولكن لا يزال، فإنه من الصعب قليلا للقيام ببعض المهام باستخدام ريدوكس سيمالت. على سبيل المثال، نحن بحاجة إلى إيقاف الجلب مؤقتا بين، أو عندما يكون هناك عدة مكالمات من هذا القبيل، والسماح فقط بأحدث، أو إذا جلبت أبي أخرى هذه البيانات ونحن بحاجة إلى إلغاء.

لا يزال بإمكاننا تنفيذ تلك، ولكن سيكون من الصعب قليلا أن تفعل بالضبط. وسيكون وضوح الرمز للمهام المعقدة ضعيفا جدا بالمقارنة مع المكتبات الأخرى، وسيكون الحفاظ عليه صعبا.

عن طريق ريدوكس-ساجا

باستخدام الوسيطة سيمالت، يمكننا الحصول على فوائد إضافية أن حل معظم الوظائف المذكورة أعلاه. تم تطوير سيمالت على أساس مولدات ES6.

يوفر سيمالت أبي التي تساعد على تحقيق ما يلي:

  • منع الأحداث التي تمنع الخيط في نفس الخط حتى يتحقق شيء
  • الأحداث غير المحظورة التي تجعل رمز غير متزامن
  • التعامل مع العرق بين طلبات متعددة غير متزامنة
  • إيقاف / اختناق / تفكيك أي عمل.

كيف يعمل ساغاس؟

تستخدم ساغاس توليفة من مولدات ES6 و أسينك تنتظر واجهات برمجة التطبيقات لتبسيط العمليات غير المتزامنة. وهي تقوم أساسا بعملها على مؤشر ترابط منفصل حيث يمكننا القيام بمكالمات أبي متعددة. يمكننا استخدام أبي لجعل كل مكالمة متزامن أو غير متزامن اعتمادا على حالة الاستخدام. يوفر أبي الوظائف التي يمكننا من خلالها جعل مؤشر الترابط الانتظار في نفس السطر حتى يرجع الطلب استجابة. سيمالت من هذا، هناك الكثير من واجهات برمجة التطبيقات الأخرى التي توفرها هذه المكتبة، مما يجعل طلبات أبي سهلة جدا للتعامل معها. مدينة))؛// على النجاح إيفاد المطاعمغولد بوت ({تايب: 'FETCH_RESTAURANTS_SUCCESS'،بايلعد: {المطاعم}،})؛} كاتش (e) {// عند إرسال خطأ رسالة الخطأغولد بوت ({تايب: 'FETCH_RESTAURANTS_ERROR'،بايلعد: {إرورمزاج: e،}})؛}}إكسبورت ديفولت فونكتيون * فيتشتريستورانتساغامونيتور {تيكن تايفيري ('FETCH_RESTAURANTS'، فيتشينيتيال)؛ // يأخذ كل طلب من هذا القبيل}

حتى إذا قمنا بإرسال عمل بسيط مع نوع FETCH_RESTAURANTS ، سوف الوسيطة ساغا الاستماع والاستجابة. في الواقع، لا يستهلك أي من الإجراءات من قبل الوسيطة. فإنه يستمع فقط ويقوم ببعض المهام الإضافية ويرسل عمل جديد إذا لزم الأمر. باستخدام هذه الهندسة المعمارية، يمكننا إرسال طلبات متعددة كل وصف

  • عندما بدأ الطلب الأول
  • عند انتهاء الطلب الأول
  • عندما بدأ الطلب الثاني

.وهلم جرا.

أيضا، يمكنك ان ترى جمال فيتشريستورانتسغاغا . لقد استخدمنا حاليا واجهة برمجة تطبيقات للاتصال لتنفيذ مكالمات الحظر. يوفر ساغاس واجهات برمجة تطبيقات أخرى، مثل شوكة ، والتي تنفذ المكالمات غير المحظورة. يمكننا الجمع بين كل من حظر و نونبلوكينغ يدعو للحفاظ على الهيكل الذي يناسب طلبنا.

من حيث قابلية، استخدام الساجس هو مفيد:

  • يمكننا هيكل ومجموعة ساجاس على أساس أي مهام معينة. يمكننا أن نطلق ملحمة واحدة من آخر ببساطة عن طريق إيفاد عمل.
  • بما أنه من الوسيطة، فإن الإجراءات التي نكتبها ستكون كائنات جس العادية، على عكس الثعالب.
  • وبما أننا نتحرك منطق العمل داخل ساجاس (وهو الوسيطة)، إذا كنا نعرف ما سيكون وظيفة ملحمة، ثم فهم رد فعل جزء منه سيكون أسهل بكثير.
  • يمكن بسهولة رصد الأخطاء وإرسالها إلى المتجر من خلال نمط محاولة / الصيد.

استخدام ريدوكس-أوبسيرفاتابلز

كما ذكر في وثائقها تحت عنوان "ملحمة هي البدائية الأساسية من ريدوكس يمكن ملاحظتها":

  1. ملحمة هي وظيفة التي تأخذ مجموعة من الإجراءات وإرجاع مجموعة من الإجراءات. وهذا هو، ملحمة يمتد جنبا إلى جنب مع قناة إرسال سيمالت العادية، بعد أن تلقت المخفضات بالفعل لهم.

  2. سيمالت دائما تشغيل من خلال المخفضات الخاصة بك قبل الملاحم حتى الحصول عليها. ملحمة فقط يتلقى وينتج تيار آخر من الإجراءات. هذا هو مماثل ل ريدوكس-ساغا، في أن أيا من سيمالت الحصول على تستهلك من قبل الوسيطة. فإنه يستمع فقط ويقوم ببعض المهام الإضافية.

لمهمتنا، يمكننا ببساطة كتابة هذا:

     كونست فيتشوسرديتايلز = أكتيون $ = & غ؛ (العمل $. ofType ( 'FETCH_RESTAURANTS'). سويتسماب (   = & غ؛اياكس. getJSON ( '/ التفاصيل "). ماب (ريسبونز = & غ؛ ريسبونز. وسيرديتايلز. سيتي). سويتسماب (   = & غ؛اياكس. getJSON ( `/ مطاعم / المدينة /`). ماب (ريسبونز = & غ؛ ({تايب: 'FETCH_RESTAURANTS_SUCCESS'، بايلعد: ريسبونز. ريستورانتس})) // إيفاد بعد النجاح). (= تايب: 'FETCH_USER_DETAILS_FAILURE'، إرور})))))    

في البداية، قد يبدو هذا مربكا قليلا. ولكن كلما فهمت رجس، وأسهل هو لخلق ملحمة.

كما هو الحال في ساجاس، يمكننا إرسال إجراءات متعددة كل واحد يصف في أي جزء من سلسلة طلب أبي مؤشر الترابط حاليا في.

من حيث التدرجية، يمكننا تقسيم الملحمات أو يؤلف ملحمات استنادا إلى مهام معينة. لذلك هذه المكتبة يمكن أن تساعد في بناء تطبيقات قابلة للتطوير. وضوح الرمز جيد إذا فهمنا نمط سيمالت من كتابة التعليمات البرمجية.

تفضيلاتي

كيف يمكنك تحديد المكتبة التي ستستخدمها؟
ذلك يعتمد على مدى تعقيد طلبات أبي لدينا. كلاهما مفاهيم مختلفة ولكن على حد سواء جيدة بما فيه الكفاية. أود أن أقترح محاولة أن نرى أي واحد يناسبك أفضل.

أين تحافظ على منطق عملك الذي يتعامل مع واجهات برمجة التطبيقات؟
ويفضل قبل المخفض، ولكن ليس في المكون. أفضل طريقة ستكون في الوسيطة (باستخدام الساج أو الملاحظ).

يمكنك أن تقرأ المزيد رياكت ديفيلوبمنت بوستس في كوديبراهما.

Async Operations in React Redux ApplicationsAsync Operations in React Redux ApplicationsRelated Topics:
Raw Semalt
أفضل طريقة لتعلم رد فعل للمبتدئين
ويس بوس
دورة تدريبية خطوة بخطوة لتحصل على بناء العالم الحقيقي رد فعل. جس + فيريباس تطبيقات ومكونات الموقع في بضع بعد الظهر. قم باستخدام كوبون الخصم 'سيتيبوانت' عند الخروج للحصول على خصم 25٪ .

March 1, 2018