Dva: هل لي أن أسأل كيف أن وضع العائد () في التأثيرات هو عملية غير مانعة ، وكيفية منع واستدعاء تأثير آخر في التأثيرات.

تم إنشاؤها على ١٢ سبتمبر ٢٠١٧  ·  12تعليقات  ·  مصدر: dvajs/dva

رمز إعادة إظهار المشكلة: (يُرجى تقديم رمز قابل لإعادة الإنتاج أو خطوات)

السلوك المتوقع: (التأثير الطبيعي المتوقع)

السلوك الفعلي: (التأثير الفعلي)

إصدارات الحزم المستخدمة: (أي إصدار من المكتبة هو المشكلة)

التعليق الأكثر فائدة

put.resolve () يحظر

yield put.resolve({ type: 'addDelay', payload: { amount: 2 } });
const count = yield select(state => state.count);
yield put({ type: 'addDelay', payload: { amount: count, delay: 0 } });

يتم حظر put.resolve () ، راجع واجهة برمجة تطبيقات redux-saga للحصول على التفاصيل

ال 12 كومينتر

قدم dva @ 2 المثال المقابل ، https://github.com/sorrycc/blog/issues/48

yield put({ type: 'addDelay', payload: { amount: 2 } });
yield take('addDelay/@<strong i="8">@end</strong>');
const count = yield select(state => state.count);
yield put({ type: 'addDelay', payload: { amount: count, delay: 0 } });

https://github.com/redux-saga/redux-saga/issues/744
يمكنك إلقاء نظرة على الحل هنا.
استخدم الاتصال مباشرة لحظر التأثير الذي يتصل بك.

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

تضمين التغريدة

effect 前后会额外触发 /@<strong i="6">@start</strong> 和 /@<strong i="7">@end</strong> 的 action,

هل هذا الرمز مغلف في الملحمة؟ ؟ لا يمكنني رؤيته في الكود المصدري لـ dva. هل يمكنك إخباري بعنوان شفرة المصدر هذه؟

hopperhuang في dva-core

التأثير في hopperhuang dva مكتوب في النموذج ، أنا فقط منزعج من هذا ، لا أعرف كيف أخرجه. بعد قراءة طريقة nihgwu ، أعتقد أنه الحل الصحيح ، أطلق عليه أولاً ، ثم اتخذ على الفور لمنع الاستقبال.

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

----- الرسالة الاصلية -----
من: "pingsoli" [email protected]
تاريخ الإرسال: 2017/09/12 22:24
المستلم: "dvajs / dva" [email protected]
نسخة إلى: "hopperhuang" [email protected] ؛ "Mention" [email protected]
الموضوع: Re: [dvajs / dva] عفوًا. وضع العائد () في التأثيرات هو عملية لا تؤدي إلى الحجب. كيفية منع واستدعاء تأثير آخر في التأثيرات. (# 1212)

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

لماذا تريد منع وضع ما هو سيناريو التطبيق هنا؟

لماذا تريد منع وضع ما هو سيناريو التطبيق هنا؟

إذا تمت معالجة إجراء put بواسطة الملحمة (التأثير في dva) ، فعند إرجاع وضع العائد ، لم يتم تنفيذ الملحمة / التأثير المقابل بعد (سيقوم مجدول redux-saga بإدراجه وجدولته تدريجيًا لاحقًا) ، والذي لا يفي متطلبات الحجب لبعض عمليات الدولة.

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

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

أسلوبي الشخصي هو استعادة طريقة الكتابة عند استخدام redux-saga مباشرة. فقط وظيفة المولد التي تستجيب مباشرة للإجراء هي التي يتم وضعها في تأثيرات dva ، والبعض الآخر مجاني.

const model = {
  // ...

  effects: {
    * showItem({ payload }, { call }) {

      // 用:
      yield call(showItemFirstStageProcedure)
      yield call(showItemSecondStageProcedure)

      // 而不是:
      // yield put({ type: 'showItemFirstStage' })
      // yield take('showItemFirstStage/@<strong i="7">@end</strong>')
      // yield put({ type: 'showItemSecondStage' })
      // yield take('showItemSecondStage/@<strong i="8">@end</strong>')
      // ...after second stage
    },

    // ...
    // end effects
  },

  // ...
  // end model
}

عندما تحتاج وظيفة المولد المجاني إلى call / select / ... من الملحمة ، يمكن استيرادها مباشرة من الملحمة:

import { effects } from 'dva/saga'

const { call, select } = effects

لكن put و take المقدمين من dva للطرق الموجودة في آثارها يتم تغليفها مرة واحدة (أي معالجة بادئة مساحة الاسم) ويجب أن يتم تمريرها من خلال توابع التأثيرات:
في https://github.com/dvajs/dva/blob/master/packages/dva-core/src/getSaga.js#L141

return { ...sagaEffects, put, take };

أو اكتب نوع الإجراء الكامل:

import { effects } from 'dva/saga'

const { take } = effects

// then
take(`${namespace}/${actionType}`)

put.resolve () يحظر

yield put.resolve({ type: 'addDelay', payload: { amount: 2 } });
const count = yield select(state => state.count);
yield put({ type: 'addDelay', payload: { amount: count, delay: 0 } });

يتم حظر put.resolve () ، راجع واجهة برمجة تطبيقات redux-saga للحصول على التفاصيل

لماذا تريد منع وضع ما هو سيناريو التطبيق هنا؟

إذا تمت معالجة إجراء put بواسطة الملحمة (التأثير في dva) ، فعند إرجاع وضع العائد ، لم يتم تنفيذ الملحمة / التأثير المقابل بعد (سيقوم مجدول redux-saga بإدراجه وجدولته تدريجيًا لاحقًا) ، والذي لا يتوافق متطلبات الحجب لبعض عمليات الدولة.

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

نعم ، لقد جربت أن وضع العائد (المخفضات) متزامن وأن وضع العائد (التأثيرات) غير متزامن

لماذا لا يمكنك وضعه مباشرة ، عليك أن تسفر عن طرح ؟؟؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات