أفضل طريقة لتنفيذ عمليات الاسترجاعات/الأحداث غير المتزامنة 1:1 في ActionScript 3 / Flex / AIR؟

StackOverflow https://stackoverflow.com/questions/53025

سؤال

لقد تم استخدام نمط الأمر في مشاريعي المرنة، مع وجود مسارات رد اتصال غير متزامنة مطلوبة بين:

  • من قام بإنشاء كائن أمر معين وكائن الأمر،
  • كائن الأمر وكائن "الوصول إلى البيانات" (أييقوم الشخص الذي يتعامل مع الإجراء البعيد باستدعاء الخوادم عبر الشبكة) التي يستدعيها كائن الأمر.

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

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

إليك مثال لتوضيح طريقتي الحالية:

  • قد يكون لدي كائن عرض يولد ملف DeleteObjectCommand مثيل بسبب بعض إجراءات المستخدم، وتمرير مراجع إلى وظيفتين من وظائف الأعضاء الخاصة به (واحدة للنجاح، وواحدة للفشل:دعنا نقول "deleteObjectSuccessHandler()" و "deleteObjectFailureHandler()" في هذا المثال) حيث تشير وظيفة رد الاتصال إلى مُنشئ فئة الأمر.
  • ثم يقوم كائن الأمر بتكرار هذا النمط مع اتصاله بكائن "الوصول إلى البيانات".
  • عندما يكتمل RPC عبر الشبكة بنجاح (أو يفشل)، يتم استدعاء وظائف رد الاتصال المناسبة، أولاً بواسطة كائن "الوصول إلى البيانات" ثم كائن الأمر، بحيث يتم أخيرًا كائن العرض الذي أنشأ العملية في المرة الأولى يتم إخطار المكان من خلال وجوده deleteObjectSuccessHandler() أو deleteObjectFailureHandler() مُسَمًّى.
هل كانت مفيدة؟

المحلول

سأحاول فكرة أخرى:

اطلب من كائن الوصول إلى البيانات الخاص بك إرجاع AsyncTokens الخاص به (أو بعض الكائنات الأخرى التي تتضمن مكالمة معلقة)، بدلاً من AsyncToken الذي يأتي من استدعاء RPC.لذلك، في DAO سيبدو الأمر كما يلي (هذا رمز سطحي للغاية):

public function deleteThing( id : String ) : DeferredResponse {
    var deferredResponse : DeferredResponse = new DeferredResponse();

    var asyncToken : AsyncToken = theRemoteObject.deleteThing(id);

    var result : Function = function( o : Object ) : void {
        deferredResponse.notifyResultListeners(o);
    }

    var fault : Function = function( o : Object ) : void {
        deferredResponse.notifyFaultListeners(o);
    }

    asyncToken.addResponder(new ClosureResponder(result, fault));

    return localAsyncToken;
}

ال DeferredResponse و ClosureResponder الفصول غير موجودة بالطبع.بدلا من اختراع بنفسك يمكنك استخدامها AsyncToken بدلاً من DeferredResponse, ولكن النسخة العامة من AsyncToken لا يبدو أن لديها أي طريقة لتحفيز المستجيبين، لذلك ربما يتعين عليك تصنيفها على أي حال. ClosureResponder هو مجرد تنفيذ IResponder التي يمكن أن تستدعي وظيفة على النجاح أو الفشل.

على أي حال، الطريقة التي يعمل بها الكود أعلاه هي أنه يستدعي خدمة RPC، وينشئ كائنًا يغلف المكالمة المعلقة، ويعيد هذا الكائن، وبعد ذلك عندما يعود RPC، يتم إغلاق إحدى عمليات الإغلاق result أو fault يتم استدعاؤه، وبما أنه لا يزال لديهم إشارات إلى النطاق كما كان عند إجراء استدعاء RPC، فيمكنهم تشغيل الأساليب على المكالمة المعلقة/الاستجابة المؤجلة.

في الأمر سيبدو شيئًا مثل هذا:

public function execute( ) : void {
    var deferredResponse : DeferredResponse = dao.deleteThing("3");

    deferredResponse.addEventListener(ResultEvent.RESULT, onResult);
    deferredResponse.addEventListener(FaultEvent.FAULT,   onFault);
}

أو يمكنك تكرار النمط باستخدام execute تقوم الطريقة بإرجاع استجابة مؤجلة خاصة بها والتي سيتم تشغيلها عند تشغيل الاستجابة المؤجلة التي يحصل عليها الأمر من DAO.

لكن.لا أعتقد أن هذا جميل بشكل خاص.ربما يمكنك القيام بشيء أجمل وأقل تعقيدًا وأقل تشابكًا باستخدام أحد أطر التطبيقات العديدة الموجودة لحل هذا النوع من المشكلات بشكل أو بآخر.اقتراحي سيكون رَفِيق.

نصائح أخرى

العديد من فئات Flex RPC، مثل RemoteObject, HTTPService, ، إلخ.يعود AsyncTokenعند الاتصال بهم.يبدو أن هذا هو ما كنت بعد.في الأساس AsyncToken يقوم بتغليف المكالمة المعلقة، مما يجعل من الممكن تسجيل عمليات الاسترجاعات (في شكل IResponder الحالات) لمكالمة محددة.

في حالة HTTPService, ، عندما تتصل send() ان AsyncToken تم إرجاعه، ويمكنك استخدام هذا الكائن لتتبع مكالمة معينة، على عكس ResultEvent.RESULT, ، والتي يتم تشغيلها بغض النظر عن نوع المكالمة (ويمكن أن تأتي المكالمات بسهولة بترتيب مختلف عن الترتيب الذي تم إرسالها به).

تعتبر AbstractCollection أفضل طريقة للتعامل مع الكائنات الثابتة في Flex / AIR.يوفر GenericDAO الإجابة.

DAO هو الكائن الذي يتمكن من إجراء عملية CRUD وغيرها من العمليات المشتركة التي يتعين القيام بها على قيمة (تُعرف باسم POJO في Java).GenericDAO هي فئة DAO قابلة لإعادة الاستخدام والتي يمكن استخدامها بشكل عام.هدف:

في Java IBM Genericdao ، لإضافة DAO جديد ، فإن الخطوات التي يتعين القيام بها هي ببساطة ، إضافة valueBject (pojo).قم بإضافة ملف تعيين hbm.xml لكائن القيمة.قم بإضافة ملف تكوين Spring المكون من 10 أسطر لـ DAO.

وبالمثل، في مشروع AS3 Swiz DAO.نريد أن نصل إلى قدم مماثلة من الإنجاز.

نموذج GenericDAO من جانب العميل:نظرًا لأننا كنا نعمل على لغة العميل، فيجب أيضًا أن ندير مجموعة كائنات ثابتة (لكل قيمة كائن).الاستخدام:مصدر:http://github.com/nsdevaraj/SwizDAO

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top