14 مارس 2025·7 دقيقة قراءة

مهام الخلفية مع تحديثات التقدم: أنماط واجهة مستخدم فعالة

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

مهام الخلفية مع تحديثات التقدم: أنماط واجهة مستخدم فعالة

لماذا يتعثر المستخدمون عندما تعمل المهام في الخلفية

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

العمل الجيد في الخلفية يتعلق بالثقة. المستخدمون يريدون ثلاثة أشياء:

  • حالة واضحة (قيد الانتظار، جارٍ، منجز)
  • انطباع زمني (حتى تقدير تقريبي)
  • إجراء واضح تاليًا (الانتظار، الاستمرار في العمل، الإلغاء، أو العودة لاحقًا)

بدون هذه العناصر قد تكون المهمة تعمل بشكل جيد، لكن التجربة تبدو معطلة.

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

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

اللبنات الأساسية: المهام، قوائم الانتظار، العاملون، والحالة

عند الحديث عن مهام الخلفية مع تحديثات التقدم، يقصد الناس عادة أربع قطع تعمل معًا.

المهمة هي وحدة العمل: استورد هذا CSV، أنشئ هذا التقرير، أو أرسل 5,000 بريد إلكتروني. قائمة الانتظار هي الصف الذي تنتظر فيه المهام حتى يمكن معالجتها. العامل يسحب المهام من القائمة وينفذ العمل (واحدة تلو الأخرى أو بالتوازي).

للواجهة، أهم جزء هو حالة دورة حياة المهمة. اجعل الحالات قليلة ويمكن التنبؤ بها:

  • قيد الانتظار (Queued): مقبولة، تنتظر عاملًا
  • جارٍ (Running): قيد المعالجة
  • مُنْجَز (Done): اكتمل بنجاح
  • فشل (Failed): توقف بخطأ

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

بعدها تحتاج طريقة للسؤال: "ما الذي يحدث الآن؟" عادةً يكون ذلك عبر نقطة نهاية للحالة أو أي طريقة قراءة تأخذ معرف المهمة وتعيد الحالة مع تفاصيل التقدم. تستخدمها الواجهة لعرض النسبة المئوية، الخطوة الحالية، وأي رسائل.

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

  • الحالة الحالية والطوابع الزمنية
  • قيمة التقدم (نسبة أو عدادات)
  • ملخص النتيجة (ما تم إنشاؤه أو تغييره)
  • تفاصيل الخطأ (لأغراض التصحيح ورسائل واضحة للمستخدم)

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

اختيار نمط قائمة الانتظار المناسب لحملك

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

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

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

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

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

تصميم نموذج تقدم يمكنك عرضه فعلاً في الواجهة

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

مخطط حالة بسيط يمكن لمعظم المهام دعمه يبدو هكذا:

  • state: queued, running, succeeded, failed, canceled
  • percent: من 0 إلى 100 عندما يمكنك قياسه
  • message: جملة قصيرة يفهمها المستخدم
  • timestamps: created, started, last_updated, finished
  • result_summary: عدادات مثل processed, skipped, errors

بعدها، حدِّد ماذا يعني "التقدم".

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

قاعدة عملية:

  • استخدم النسبة عندما يمكنك الإبلاغ عن "X من Y".
  • استخدم الخطوات عندما يكون المدى الزمني غير معروف (التحقق من الملف، الاستيراد، إعادة بناء الفهارس، الانتهاء).
  • استخدم تقدم غير محدد عندما لا ينطبق أي منهما، لكن حافظ على رسالة متجددة.

خزن النتائج الجزئية أثناء تشغيل المهمة. هذا يسمح للواجهة بعرض شيء مفيد قبل انتهاء المهمة، مثل عد خطأ مباشر أو معاينة ما تغير. لاستيراد CSV، قد تحفظ rows_read, rows_created, rows_updated, rows_rejected، بالإضافة إلى آخر رسائل الخطأ.

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

توصيل تحديثات التقدم: المسح الدوري، الدفع، والهجين

Prevent duplicate imports
Return job IDs instantly and track runs so users stop re-uploading the same file.
Create Workflow

نقل التقدم من الخادم إلى الشاشة هو حيث تنهار الكثير من التطبيقات. اختر طريقة توصيل تناسب كم يتغير التقدم وعدد المستخدمين المتوقعين الذين سيراقبونه.

المسح الدوري بسيط: الواجهة تسأل عن الحالة كل N ثانية. قيمة افتراضية جيدة هي 2 إلى 5 ثوانٍ بينما المستخدم ينظر، ثم التباطؤ مع مرور الوقت. إذا استمرت المهمة أكثر من دقيقة، انتقل إلى 10 إلى 30 ثانية. إذا كانت التبويبة في الخلفية، أبطئ أكثر.

التحديثات الدفعية (WebSockets، server-sent events، أو إشعارات الجوال) مفيدة عندما يتغير التقدم بسرعة أو يهتم المستخدمون بـ"الآن فورًا". الدفع ممتاز للإحساس باللحظية، لكنك لا تزال بحاجة إلى بديل عندما تنقطع الاتصال.

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

عندما تتوقف التحديثات، عاملها كحالة من الدرجة الأولى. اعرض "آخر تحديث قبل دقيقتين" واقترح تحديثًا. في الخلفية، علّم المهمة بأنها قديمة إذا لم ترسل نبضات قلب.

أنماط واجهة المستخدم للمهام الطويلة التي تبدو واضحة

الوضوح يأتي من شيئين: مجموعة صغيرة من الحالات المتوقعة، ونص يبلّغ الناس بما سيحدث لاحقًا.

سَمِّ الحالات في الواجهة، وليس فقط في الخادم. قد تكون المهمة قيد الانتظار (تنتظر دورها)، جارٍ (يقوم بالعمل)، تنتظر إدخالًا (تحتاج اختيارًا)، مكتملة، مكتملة مع أخطاء، أو فشلت. إذا لم يستطع المستخدمون تمييز هذه الحالات، سيفترضون أن التطبيق عالق.

استخدم نصًا بسيطًا ومفيدًا بجانب مؤشر التقدم. "جارٍ استيراد 3,200 صف (1,140 مُعالَج)" أفضل من "جاري المعالجة." أضف جملة واحدة تجيب: هل يمكنني المغادرة، وما الذي سيحدث؟ على سبيل المثال: "يمكنك إغلاق هذه النافذة. سنستمر في الاستيراد في الخلفية ونخطرك عندما يكتمل."

مكان عرض التقدم يجب أن يتناسب مع سياق المستخدم:

  • نافذة منبثقة (Modal) مناسبة عندما تحجب المهمة الخطوة التالية (مثلاً إنشاء PDF للفاتورة يحتاجه المستخدم الآن).
  • إشعار مؤقت (Toast) مناسب للمهام السريعة التي لا ينبغي أن تقاطع.
  • التقدم المضمن في صف جدول مناسب لعمليات لكل عنصر.

لأي شيء أطول من دقيقة، أضف صفحة وظائف بسيطة (Jobs) أو لوحة نشاط حتى يتمكن الناس من العثور على العمل لاحقًا.

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

الإبلاغ عن "مكتمل مع أخطاء" دون إرباك المستخدمين

Push updates when you need them
Add real-time status with web or mobile notifications with polling as backup.
Try It

"مكتمل" ليس دائمًا انتصارًا. عندما تقوم مهمة خلفية بمعالجة 9,500 سجل وفشل 120، يحتاج المستخدمون إلى فهم ما حدث دون قراءة السجلات.

عامل النجاح الجزئي كنتيجة من الدرجة الأولى. في السطر الرئيسي للحالة، اظهر الجانبين معًا: "تم استيراد 9,380 من 9,500. فشل 120." هذا يحافظ على الثقة لأن النظام صادق ويؤكد أن العمل تم حفظه.

ثم اعرض ملخصًا صغيرًا للأخطاء يمكن للمستخدم التصرف بناءً عليه: "حقل مطلوب مفقود (63)" و"تنسيق تاريخ غير صالح (41)." في الحالة النهائية، "مكتمل مع مشكلات" غالبًا أوضح من "فشل" لأنه لا يعطي انطباعًا بأن لا شيء نجح.

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

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

إجراءات الإلغاء وإعادة المحاولة التي يمكن للمستخدم الوثوق بها

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

عادة هناك وضعان صالحان للإلغاء:

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

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

اجعل الإلغاء آمنًا عبر تصميم العمل بحيث يكون قابلًا للتكرار. إذا كانت المهمة تكتب بيانات، فضّل العمليات المتسامحة مع التكرار (آمنة للتنفيذ مرتين) وأجرِ تنظيفًا عند الحاجة. على سبيل المثال، إذا أنشأ استيراد CSV سجلات، خزّن معرف تشغيل المهمة حتى تتمكن من مراجعة ما تغيّر في التشغيل #123.

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

اجراءات تحكّم تحافظ على التوقعات:

  • حد المحاولات وأظهر العد.
  • منع التشغيل المزدوج بتعطيل إعادة المحاولة أثناء التشغيل.
  • اطلب تأكيدًا عندما قد تُكرر الآثار الجانبية (بريد، دفعات، تصديرات).
  • اعرض آخر خطأ وآخر خطوة ناجحة في لوحة التفاصيل.

خطوة بخطوة: تدفق من النقرة حتى الإكمال

Deploy your job system anywhere
Run on AppMaster Cloud or export source code for your own infrastructure.
Deploy App

تدفق شامل جيد يبدأ بقانون واحد: يجب ألا تنتظر الواجهة العمل نفسه أبدًا. يجب أن تنتظر معرف المهمة فقط.

التدفق (من نقرة المستخدم إلى الحالة النهائية)

  1. المستخدم يبدأ المهمة، وتعود واجهة برمجة التطبيقات بسرعة. عند النقر على استيراد أو إنشاء تقرير، يقوم الخادم فورًا بإنشاء سجل مهمة ويعيد معرف مهمة فريد.

  2. ضمّن العمل في قائمة الانتظار وحدد الحالة الأولى. ضع معرف المهمة في قائمة الانتظار وضع الحالة على queued مع تقدم 0%. هذا يعطي الواجهة شيء حقيقي لتعرضه قبل أن يلتقط العامل المهمة.

  3. العامل يبدأ ويبلغ عن التقدم. عند بدء العامل، ضع الحالة على running، خزّن وقت البدء، وحدّث التقدم في قفزات صغيرة وصادقة. إذا لم تستطع قياس النسبة، اعرض خطوات مثل Parsing، Validating، Saving.

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

  5. أنهِ بنتيجة دائمة. عند الاكتمال، خزّن وقت الانتهاء، المخرجات (مرجع تحميل، معرفات مُنشأة، عدادات ملخصة)، وتفاصيل الأخطاء. ادعم الحالة المكتملة مع أخطاء كحالة مستقلة، لا كنتيجة مبهمة.

قواعد الإلغاء وإعادة المحاولة

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

سيناريو مثالي: استيراد CSV مع تقدم وأخطاء جزئية

Design honest progress updates
Use percent or step states you can reliably store and display across web and mobile.
Try AppMaster

مكان شائع حيث تهم مهام الخلفية مع تحديثات التقدم هو استيراد CSV. تخيل CRM حيث يرفع شخص تشغيل المبيعات ملف customers.csv به 8,420 صفًا.

بعد الرفع مباشرة، يجب أن تتحول الواجهة من "لقد نقرت زرًا" إلى "هناك مهمة، ويمكنك المغادرة." بطاقة مهمة بسيطة في صفحة Imports تعمل جيدًا:

  • تم استلام الرفع: "تم رفع الملف. جارٍ التحقق من الأعمدة..."
  • قيد الانتظار: "في انتظار عامل متاح (مهمتان قبلك)."
  • جارٍ: "جارٍ استيراد العملاء: 3,180 من 8,420 مُعالَج (38%)."
  • التجهيز للانتهاء: "حفظ النتائج وبناء التقرير..."

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

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

تم استيراد 8,102 عميلًا. تم تخطي 318 صفًا.

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

يجب أن تكون إعادة المحاولة آمنة ومحددة. الإجراء الأساسي قد يكون إعادة محاولة الصفوف الفاشلة، بإنشاء مهمة جديدة تعالج 318 صفًا المتبقية بعد أن يصلح المستخدم CSV. اجعل المهمة الأصلية للقراءة فقط حتى يبقى السجل التاريخي صادقًا.

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

أخطاء شائعة تؤدي إلى تقدم وإعادة محاولات مربكة

أسرع طريقة لفقدان الثقة هي عرض أرقام ليست حقيقية. شريط تقدم يقف عند 0% لمدة دقيقتين ثم يقفز إلى 90% يبدو تخمينًا. إذا لم تعرف النسبة الحقيقية، اعرض خطوات (Queued، Processing، Finalizing) أو "X من Y عناصر معالجة."

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

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

أخطاء متكررة:

  • نسبة تقدم زائفة لا تطابق العمل الحقيقي
  • عرض تراكيب أخطاء تقنية للمستخدمين (stack traces، أكواد)
  • لا معالجة للانقضاء، التكرار، أو التكرار الآمن
  • إعادة محاولة تنشئ مهمة جديدة دون شرح ما سيحدث
  • إلغاء يغير الواجهة فقط وليس سلوك العامل

تفصيل صغير لكنه مهم: فصل رسالة المستخدم عن تفاصيل المطور. اعرض "فشل تحقق 12 صفًا" للمستخدم، واحتفظ بالتتبع الفني في السجلات.

قائمة تحقق سريعة قبل إطلاق مهام الخلفية للمستخدمين

Turn polling into a pattern
Set a simple status endpoint and a UI refresh rhythm that stays responsive.
Build Now

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

يجب أن تكشف كل مهمة عن لقطة يمكنك عرضها في أي مكان: الحالة (queued, running, succeeded, failed, canceled)، التقدم (0-100 أو خطوات)، رسالة قصيرة، الطوابع الزمنية (created, started, finished)، ومؤشر النتيجة (مكان وجود المخرجات أو التقرير).

اجعل حالات الواجهة واضحة ومتسقة. يحتاج المستخدمون إلى مكان موثوق للعثور على المهام الحالية والسابقة، مع تسميات واضحة عند عودتهم ("مكتمل أمس"، "ما يزال جارٍ"). لوحة الوظائف الأخيرة تمنع النقر المتكرر والعمل المكرر.

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

عامل الفشل الجزئي كنتيجة حقيقية. اعرض ملخصًا قصيرًا ("تم استيراد 97، تم تخطي 3") وقدم تقرير أخطاء يمكن للمستخدم استخدامه فورًا.

اخطط للتعافي. يجب أن تعيش المهام عبر إعادة التشغيل، ويجب أن تنتقل المهام العالقة إلى حالة واضحة مع إرشادات ("حاول مرة أخرى" أو "اتصل بالدعم مع معرف المهمة").

الخطوات التالية: نفذ سير عمل واحد وتوسع بعد ذلك

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

شاشة سجل المهام البسيطة غالبًا ما تمنح تحسّنًا كبيرًا في الجودة. تعطي الناس مكانًا للعودة إليه بدلًا من التحديق في رمز دوار.

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

ترتيب بنائي عملي لتجنب إعادة الكتابة:

  • نفذ حالات المهمة والانتقالات أولًا (queued، running، succeeded، failed، finished-with-errors)
  • أضف شاشة سجل مهام مع فلاتر أساسية (آخر 24 ساعة، مهامي فقط)
  • أضف أرقام التقدم فقط عندما يمكنك الحفاظ عليها صادقة
  • أضف الإلغاء فقط بعد أن تضمن تنظيفًا ثابتًا
  • أضف إعادة المحاولة فقط عندما تكون واثقًا من أن المهمة قابلة للتكرار

إذا كنت تبني هذا بدون كتابة كود، منصة لا-كود مثل AppMaster يمكنها المساعدة عبر السماح لك بنمذجة جدول حالة المهمة (PostgreSQL) وتحديثه من سير العمل، ثم عرض الحالة في واجهة الويب والجوال. للفرق التي تريد مكانًا واحدًا لبناء الخلفية، الواجهة، والمنطق الخلفي، AppMaster (appmaster.io) مصممة للتطبيقات الكاملة، ليست مجرد نماذج أو صفحات.

الأسئلة الشائعة

What’s the difference between a slow request and a real background task?

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

Which job states should I show to users?

اجعلها بسيطة: queued، running، done، وfailed، وأضف canceled إذا دعمت الإلغاء. استخدم نتيجة منفصلة مثل "مكتمل مع مشكلات" عندما نجح معظم العمل لكن بعض العناصر فشلت، حتى لا يعتقد المستخدم أن كل شيء ضاع.

How do I make sure users don’t lose a task when they refresh the page?

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

Where should job progress be stored so it survives crashes and restarts?

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

When should I use percent progress vs step-based progress?

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

Should I use polling or push to update progress in the UI?

المسح الدوري بسيط: الواجهة تطلب الحالة كل N ثانية. ابدأ حول كل 2–5 ثوانٍ بينما المستخدم يشاهد، ثم ابطئ للمهام الطويلة أو الألسنة في الخلفية. التحديثات الفورية عبر Push أسرع، لكن احتفظ دائمًا ببديل عندما تنقطع الاتصالات.

What should the UI do if progress stops updating?

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

Where should long-running task progress appear in the UI?

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

How do I report “finished with errors” without scaring users?

عامل الإكمال الجزئي كنتيجة حقيقية واذكر الجزأين بوضوح، مثل "تم استيراد 9,380 من 9,500. فشل 120." ثم قدم ملخص أخطاء قابلًا للتصرف يمكن للمستخدم إصلاحه دون قراءة سجلات فنية، واحتفظ بالتفاصيل التقنية داخل السجلات الداخلية.

How can I implement cancel and retry without creating duplicates or confusion?

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

من السهل أن تبدأ
أنشئ شيئًا رائعًا

تجربة مع AppMaster مع خطة مجانية.
عندما تكون جاهزًا ، يمكنك اختيار الاشتراك المناسب.

البدء
مهام الخلفية مع تحديثات التقدم: أنماط واجهة مستخدم فعالة | AppMaster