إلغاء الانتظار المحلي باستخدام حزمة SDK لـ Node.js
مرّر إشارة AbortController إلى solve لإيقاف الانتظار محليًا. احفظ مدخلات المهمة كاملة، بما فيها requestId، قبل استدعاء حزمة SDK لتتمكن من الاستعادة حتى إذا انتهى الاستدعاء قبل تلقي معرّف المهمة.
في هذه الصفحة
احفظ الطلب، ثم مرّر الإشارة
استخدم حزمة SDK الرسمية لـ JavaScript على Node.js 22 أو أحدث، مع إبقاء مفتاح API على الخادم. استبدل اسم المضيف والإجراء في المثال بالقيم المستهدفة، واضبط ملف تعريف موقع نشطًا، وعيّن متغير بيئة الوكيل.
ينشئ المثال requestId قبل استدعاء solve. احفظ ذلك المعرّف ومدخلات المهمة دون تغيير في تخزين دائم قبل الاستدعاء، وليس في معالج الأخطاء فقط. يؤدي إنشاء معرّف جديد أثناء الاستعادة إلى فقدان الارتباط بالطلب الأصلي.
import { randomUUID } from 'node:crypto';
import { Solvethree, SolvethreeError, TaskFailedError } from '@solvethree/sdk';
const client = new Solvethree({ apiKey: process.env.SOLVETHREE_API_KEY });
const task = { site: 'accounts.example.com', action: 'login', proxy: process.env.SOLVETHREE_PROXY, requestId: randomUUID() };
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), 5000);
try {
const result = await client.solve(task, { signal: controller.signal, timeoutMs: 180000 });
console.log('Ready task:', result.id);
// Submit this result with its browser identity and original proxy.
} catch (error) {
if (error instanceof TaskFailedError) {
console.error('Failed task:', error.taskId, error.errorCode);
} else if (error instanceof SolvethreeError) {
console.error('Recovery IDs:', error.requestId ?? task.requestId, error.taskId);
// If taskId exists, retrieve it. Otherwise replay the unchanged task with
// this requestId. Canceling local waiting did not cancel the remote task.
}
throw error;
} finally { clearTimeout(timer); }يستدعي المؤقت الذي مدته خمس ثوانٍ abort؛ وتربط signal وحدة التحكم تلك بعملية حزمة SDK. وتحدد قيمة timeoutMs المنفصلة مهلة الحل بـ 180 ثانية. يمكن لأي منهما إنهاء الانتظار، لذا احتفظ بمعلومات الاستعادة لكلتا الحالتين. تمسح كتلة finally المؤقت إذا انتهت العملية أولًا.
استعد المهمة باستخدام المعرّفات المتوفرة لديك
تسجل كتلة catch معرّفات الاستعادة وتعيد طرح الخطأ؛ ولا تستأنف المهمة. يجب على الجهة المستدعية الاحتفاظ بهذه المعرّفات واختيار مسار الاستعادة المناسب.
- فشل نهائي: تعامل مع
TaskFailedErrorأولًا، كما يفعل المثال. افحصerrorCodeورسالة الخطأ، ثم توقف عن استطلاع حالة تلك المهمة الفاشلة. - معرّف المهمة معروف: إذا كان
SolvethreeError.taskIdموجودًا، فاستأنف الاسترجاع عبرgetTaskباستخدام المعرّف نفسه. لا تستدعِsolveمجددًا لمجرد استئناف الاستطلاع. - لا يوجد معرّف للمهمة: استعد نتيجة الإنشاء بتمرير المهمة المحفوظة دون تغيير إلى
createTaskمعrequestIdنفسه. استخدمrequestIdالوارد في الخطأ عند توفره، وإلا فاستخدم المعرّف المحفوظ قبل الاستدعاء. انقطاع الاتصال لا يثبت فشل الإنشاء.
تؤدي إعادة إرسال المدخلات المطابقة مع requestId نفسه إلى إرجاع المهمة الموجودة. يؤدي تغيير المدخلات مع إعادة استخدام ذلك المعرّف إلى تعارض، لذا لا تغيّر الوكيل أو اسم المضيف أو الإجراء أثناء الاستعادة.
عند استرجاع المهمة، تعني pending وsolving مواصلة الانتظار ضمن الحد المحلي الذي اخترته. وحدها ready تحتوي على حل قابل للاستخدام. توقف عند failed وافحص تفاصيل الخطأ.
اختبر الإلغاء والاستعادة بانتظار محدود
- 1.
احفظ طلب اختبار واحدًا
سجّل مدخلات المهمة كاملة وقيمة requestId الخاصة بها قبل تشغيل المثال. احتفظ بهذه القيم طوال الاختبار.
- 2.
راقب كيف ينتهي الاستدعاء الأول
إذا كانت العملية لا تزال تنتظر عند انطلاق المؤقت بعد خمس ثوانٍ، فاحفظ الخطأ الناتج ومعرّفات الاستعادة. قد تصل نتيجة جاهزة أو حالة فشل نهائي أولًا؛ وعندها لا تكون تلك التجربة قد اختبرت الإلغاء.
- 3.
استأنف المهمة نفسها
استخدم مسار الاستعادة أعلاه للحصول على معرّف المهمة، ثم استدعِ getTask بذلك المعرّف واضبط waitMs على 15000. حدّد عدد محاولات الاسترجاع أو عيّن مهلة نهائية محلية للاختبار. إذا ظلت المهمة في حالة pending أو solving عند بلوغ ذلك الحد، فاحتفظ بمعرّفها لاستئنافها لاحقًا بدلًا من إنشاء مهمة أخرى.
تحقق من أن الاستعادة تعيد معرّف المهمة الأصلي كلما كان معروفًا مسبقًا. يختبر ذلك الإلغاء المحلي واستعادة المهمة، لا ما إذا كان الموقع المستهدف يقبل الرمز الناتج.
المصادر ومرجع API
شغّل مهمتك الأولى.
ابدأ برصيد قدره $5 في مساحة العمل.