جافا سكريبت:إطلاق الإجراء عند الخروج من الوظيفة

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

سؤال

هل هناك طريقة للاستماع إلى وظيفة جافا سكريبت للخروج؟مشغل يمكن إعداده عند اكتمال الوظيفة؟

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

مثال:

function doStuff() {
  blockUI();
  ajaxCall();
  unblockUI();
};

هل هناك طريقة لـ doStuff للاستماع إلى اكتمال ajaxCall، قبل إطلاق unBlockUI؟كما هو الحال، فهو يعالج الوظيفة خطيًا، ويستدعي كل كائن بالترتيب، ثم يتم إنشاء خيط منفصل لإكمال كل كائن.لذلك، على الرغم من أن مكالمة AJAX الخاصة بي قد تستغرق من 10 إلى 15 ثانية حتى تكتمل، إلا أنني أقوم بحظر المستخدم لجزء من الثانية فقط، وذلك بسبب التنفيذ الخطي للوظيفة.

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

هل كانت مفيدة؟

المحلول

مهما كنت تنجز إجراءات Ajax، فإن ما تحتاجه هو وظيفة "رد الاتصال" التي سيتم تشغيلها بمجرد اكتمالها:

function ajaxCall(callback){
    //do ajax stuff...
    callback();
}

ثم:

function doStuff(){
    blockUI();
    ajaxCall(unblockUI);
}

نصائح أخرى

يجب أن تحدد مكالمة AJAX وظيفة رد اتصال.يمكنك استدعاء unblockUI من داخل رد الاتصال.

ساجاكس هي مكتبة AJAX بسيطة تحتوي على مزيد من المساعدة حول كيفية إجراء مكالمات AJAX.

هناك ايضا وظيفة أخرى الذي يصف ما تبحث عنه.

يمكنك القيام بـ xhr متزامن.قد يؤدي هذا إلى حظر واجهة المستخدم بالكامل طوال مدة المكالمة (بغض النظر عن المدة التي قد تستغرقها).

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

الجواب بسيط، عليك استدعاء unblockUI() عندما يقوم طلب ajax الخاص بك بإرجاع النتيجة، باستخدام jQuery يمكنك القيام بذلك على النحو التالي:

function doStuff(){

    blockUI();

    jQuery.ajax({
        url: "example.com",
        type: "POST",           //you can use GET or POST
        success: function(){

            unblockUI();
        }
    });
}

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

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