Q



q

Q

طرق الوعد

معظم الطرق الوعد لها نظراء "ثابتون" على الكائن الرئيسي Q ، الذي سيقبل إما الوعد أو عدم الوعد ، وفي الحالة الأخيرة يخلق الوعد الذي تم الوفاء به أولاً. على سبيل المثال ، Q.when(5, onFulfilled) مساوية لـ Q(5).then(onFulfilled) . كل الآخرين لديهم نظراء ثابت يتم تسمية نفس طريقة الوعد.

يتم تسمية بعض الأساليب بنفس الكلمات المحفوظة في جافا سكريبت ، مثل try ، catch ، finally . يساعد هذا في إظهار التوازي الواضحة بين بنى اللغات المتزامنة القياسية والعمليات المتزامنة غير المتزامنة. ومع ذلك ، فإن استخدام الكلمات كأسماء خاصية مدعوم فقط من إصدار ECMAScript 5 الخاص بلغة جافا سكريبت ، والذي لا يتم تنفيذه في بعض المتصفحات القديمة مثل IE8 أو Safari 5 أو Android 2.2 أو PhantomJS 1.8. إذا كنت تستهدف هذه المتصفحات ، ولا تستخدم لغة مثل CoffeeScript التي تعتني بهذا الأمر ، فاستخدم اسمها المستعار بدلاً من ذلك ، أو تهرب منها مثل Q["try"](...) أو promise["catch"](...) .

طرق الوعد الأساسية

وعد. ثم (على ما تم تنفيذه ، على ريكيد ، onProgress)

الأسلوب then من مواصفات Promises / A + ، مع معالج تقدم إضافي.

promise.catch (onRejected)

الاسم المستعار: promise.fail ( promise.fail بخلاف ES5)

طريقة السكر ، ما يعادل promise.then(undefined, onRejected) .

promise.progress (onProgress)

promise.observeEstimate : promise.observeEstimate أو واجهة مشابهة من المقرر استبدال هذه الطريقة في الإصدار 2. التقدم لا يؤلف بشكل جيد. https://github.com/kriskowal/gtor#progress-and-estimated-time-to-completion

طريقة السكر ، أي ما يعادل promise.then(undefined, undefined, onProgress) . يتلقى المعالج onProgress القيم التي تم إرسالها إلى هذا الوعد إما من طريقة الإعلام المؤجلة المقابلة ، أو من الوعد الذي أصبح هذا الوعد بحكم إعادته من معالج.

promise.finally (رد)

الاسم المستعار: promise.fin ( promise.fin بخلاف ES5)

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

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

وعد. done (على الشغل ، على ريكيد ، onProgress)

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

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

يكون الاستثناءات التي done بواسطة تتبعات مكدس طويلة إذا تم تعيين Q.longStackSupport إلى true . إذا تم تعيين Q.onerror ، فسيتم تسليم الاستثناءات هناك بدلاً من طرحها في دورة مستقبلية.

القاعدة الذهبية من done مقابل الاستخدام هو: إما return الوعد إلى شخص آخر ، أو إذا انتهت السلسلة معك ، ندعو done لإنهاء ذلك. إنهاء مع catch غير كافية لأن معالج catch قد نفسه خطأ.

طرق الوعد للكائن

promise.get (PROPERTYNAME)

يرجع الوعد للحصول على الخاصية المسماة كائن. يعادل في الأساس ل

promise.then(function (o) {
  return o[propertyName];
});

وعد.البوست (methodName ، args)

الاسم المستعار التجريبي : promise.mapply

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

promise.then(function (o) {
  return o[methodName].apply(o, args);
});

promise.invoke (methodName، ... args)

الاسم المستعار: promise.send

الاسم المستعار التجريبي : promise.mcall

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

promise.keys ()

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

promise.then(function (o) {
  return Object.keys(o);
});

طرق الوعد مقابل الوظيفة

promise.fbind (... args) ( موقوف )

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

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

var getUserData = Q.fbind(function (userName) {
  if (!userName) {
    throw new Error("userName must be truthy!");
  }

  if (localCache.has(userName)) {
    return localCache.get(userName);
  }

  return getUserFromCloud(userName);
});

promise.fapply (وسائط)

يرجع وعدًا بنتيجة استدعاء وظيفة ، مع مجموعة معينة من الوسيطات. يعادل في الأساس ل

promise.then(function (f) {
  return f.apply(undefined, args);
});

لاحظ أن هذا سيؤدي إلى نفس عملية إرجاع الاستثناء للقيمة / fbind كما هو موضح أعلاه من أجل fbind .

promise.fcall (... وسائط)

الاسم المستعار الثابت: Q.try (متصفحات ES5 فقط)

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

في شكله الثابت ، هو اسم مستعار مثل Q.try ، لأنه يحتوي على دلالات مماثلة لكتلة try (ولكن التعامل مع كل من الاستثناءات المتزامنة والرفض غير المتزامن). هذا يسمح رمز مثل

Q
.try(function () {
  if (!isConnectedToCloud()) {
    throw new Error("The cloud is down!");
  }

  return syncToCloud();
})
.catch(function (error) {
  console.error("Couldn't sync to the cloud", error);
});

طرق الوعد-المصفوفة

promise.all ()

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

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

Q.all([getFromDisk(), getFromCloud()]).done(function (values) {
  assert(values[0] === values[1]); // values[0] is fromDisk and values[1] is fromCloud
});

promise.allSettled ()

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

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

Q.allSettled([saveToDisk(), saveToCloud()]).spread(function (disk, cloud) {
  console.log("saved to disk:", disk.state === "fulfilled");
  console.log("saved to cloud:", cloud.state === "fulfilled");
}).done();

ستكون لقطات الحالة في نفس النموذج مثل تلك التي تم استرجاعها عبر promise.inspect ، أي إما { state: "fulfilled", value: v } promise.inspect { state: "fulfilled", value: v } أو { state: "rejected", reason: r } .

وعد.سعر (على الشغل ، على ريكيد)

مثل then ، ولكن "ينتشر" المصفوفة في معالج الوفاء المتنوعة. إذا تم رفض أي من الوعود في المصفوفة ، فبدلاً من ذلك يتم رفض onRejected مع سبب رفض الوعد الأول المرفوض.

هذا مفيد بشكل خاص بالاقتران مع all ، على سبيل المثال:

Q.all([getFromDisk(), getFromCloud()]).spread(function (diskVal, cloudVal) {
  assert(diskVal === cloudVal);
}).done();

طرق المساعدة

promise.thenResolve (القيمة)

لا نظير ثابت

طريقة السكر ، أي ما يعادل promise.then(function () { return value; }) .

promise.thenReject (العقل)

لا نظير ثابت

طريقة السكر ، ما يعادل promise.then(function () { throw reason; }) .

promise.tap (onFulfilled)

المقدمة في الإصدار 1.1.0 (نوفمبر 2014)

onFulfilled قيمة الوعد عندما يتم الوفاء به ، حيث يعيد الوعد لنفس القيمة ، وربما يكون مؤجلًا ولكن لا يتم استبداله بالوعد الذي تم إرجاعه من قبل المعالج الذي onFulfilled .

Q("Hello, World!")
.delay(1000)
.tap(console.log)
.then(function (message) {
  expect(message).toBe("Hello, World!");
})

وعد. timeout (مللي ثانية ، رسالة)

يعود الوعد الذي سيكون له نفس النتيجة promise ، إلا أنه إذا لم يتم الوفاء promise أو رفضه قبل ms ثانية ، سيتم رفض الوعد المرتد مع وجود Error في message المعطاة. إذا لم يتم توفير الرسالة ، فستكون الرسالة "تم ضبط "Timed out after " + ms + " ms" .

promise.timeout(10000).then(
  function (result) {
  // will be called if the promise resolves normally
  console.log(result);
  },
  function (err) {
  // will be called if the promise is rejected, or the 10 second timeout occurs
  console.log(err);
  }
);

promise.delay (مللي ثانية)

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

Q.delay (مللي ثانية)

إذا تم تمرير إصدار ثابت من Q.delay وسيطة واحدة فقط ، فإنه يعيد الوعد الذي سيتم الوفاء بها undefined بعد مرور مللي ms ثانية على الأقل. (إذا تم استدعاؤه باستخدام Q.delay(value, ms) ، فإنه يستخدم ترجمة ثابتة ثابتة مناظرة ، أي أن Q.delay(value, ms) تساوي Q(value).delay(ms) .)

هذه طريقة ملائمة لإدخال تأخير في سلسلة الوعد ، أو حتى ببساطة للحصول على بنية أكثر setTimeout لـ setTimeout :

Q.delay(150).then(doSomething);

طرق التفتيش الحكومية

promise.isFulfilled ()

إرجاع ما إذا كان هناك وعد معين في حالة الوفاء. عندما يتم استخدام النسخة الثابتة في حالة عدم الوعود ، تكون النتيجة true دائمًا.

promise.isRejected ()

إرجاع ما إذا كان هناك وعد معين في حالة الرفض. عند استخدام الإصدار الثابت في حالة عدم الوعود ، تكون النتيجة دائمًا false .

promise.isPending ()

إرجاع ما إذا كان هناك وعد معين في الحالة المعلقة. عند استخدام الإصدار الثابت في حالة عدم الوعود ، تكون النتيجة دائمًا false .

promise.inspect ()

لعرض كائن "لقطة من الحالة" ، والذي سيكون في أحد النماذج الثلاثة:

  • { state: "pending" }
  • { state: "fulfilled", value: <fulfllment value> }
  • { state: "rejected", reason: <rejection reason> }

وعد الوعد

Q.defer ()

إرجاع كائن "مؤجل" مع:

  • promise الملكية
  • resolve(value)
  • reject(reason) طريقة reject(reason)
  • notify(value) طريقة
  • طريقة makeNodeResolver()

تتحكم أساليب resolve reject في حالة خاصية promise ، والتي يمكنك تسليمها للآخرين مع الاحتفاظ بسلطة تعديل حالتها لنفسك. طريقة الإعلام هي لإشعار التقدم ، وأسلوب makeNodeResolver هو للتفاعل مع Node.js (انظر أدناه).

في جميع الحالات التي يتم فيها حل الوعد (أي إما يتم الوفاء بها أو رفضها) ، يكون القرار نهائيًا ولا يمكن إعادة تعيينه. محاولة الاتصال resolve ، أو reject ، أو notify إذا تم حل promise بالفعل سيكون بمثابة أمر.

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

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

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

deferred.resolve (القيمة)

إن الدعوة إلى resolve مع الوعد المعلق يجعلنا promise بالانتظار على الوعد الذي تم تمريره ، أو أن ننجح في تحقيق قيمته أو رفضه مع سبب رفضه (أو البقاء معلقة إلى الأبد ، إذا كان الوعد الذي تم تمريره).

الدعوة إلى resolve مع الوعد المرفوض يؤدي إلى رفض الوعد مع سبب رفض الوعد الذي تم تمريره.

الدعوة إلى resolve مع الوفاء بالوعد يجعل promise يتم الوفاء به مع قيمة الوفاء الوعد الذي تم تمريره.

يؤدي resolve باستخدام قيمة غير promise إلى الوفاء بالالتزام بتلك القيمة.

deferred.reject (العقل)

استدعاء reject مع سبب ما يجعل promise بالرفض لهذا السبب.

deferred.notify (القيمة)

يؤدي الاتصال notify بقيمة ما إلى إعلامك بالتقدم بهذه القيمة. أي ، أي معالجات onProgress مسجلة promise أو وعود مستمدة من promise سيتم استدعاؤها بقيمة التقدم.

كائن Q

Q (قيمة)

إذا كانت value عبارة عن وعد Q ، فأعد الوعد.

إذا كانت value هي وعد من مكتبة أخرى ، يتم إكراهها على وعد Q (حيثما أمكن).

إذا كانت value ليست وعدًا ، فأعد وعدًا يتم الوفاء به value .

Q.reject (العقل)

يعود الوعد الذي يرفض مع reason .

Q.Promise (محلل)

يتصل بشكل متزامن resolver(resolve, reject, notify) ويعيد الوعد الذي يتم التحكم في حالته من خلال الوظائف التي تم تمريرها إلى resolver . هذه واجهة برمجة تطبيقات بديلة لخلق الوعد ولها نفس قوة المفهوم المؤجل ، ولكن دون إدخال كيان مفاهيمي آخر.

إذا resolver استثناءً ، فسيتم رفض الوعد المرتد مع هذا الاستثناء المسبب لسبب الرفض.

ملاحظة : في أحدث إصدار من github ، يُطلق على هذه الطريقة اسم Q.Promise ، ولكن إذا كنت تستخدم إصدار حزمة npm 0.9.7 أو أقل ، فإن هذه الطريقة تسمى Q.promise (صغيرة في مقابل الأحرف الكبيرة p).

التواصل مع Node.js Callbacks

يوفر Q عددًا من الوظائف للتفاعل مع واجهة برمجة التطبيقات (err, result) Node.js) النمطية (err, result) callback.

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

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

Q.nfbind (nodeFunc ، ... args)

الاسم المستعار : Q.denodeify

يقوم بإنشاء دالة وعد - إرجاع من وظيفة نمط Node.js ، مع ربطها اختياريًا بالمتغيرات المتغيرة. مثال:

var readFile = Q.nfbind(FS.readFile);

readFile("foo.txt", "utf-8").done(function (text) {

});

لاحظ أنه إذا كان لديك أسلوب يستخدم نمط رد الاتصال Node.js ، بدلاً من مجرد دالة ، فستحتاج إلى ربط this القيمة قبل تمريرها إلى nfbind ، مثل:

var Kitty = mongoose.model("Kitty");
var findKitties = Q.nfbind(Kitty.find.bind(Kitty));

ستكون الإستراتيجية الأفضل للأساليب هي استخدام Q.nbind ، كما هو موضح أدناه.

Q.nbind (nodeMethod، thisArg، ... args)

يقوم بإنشاء دالة وعد - إرجاع من طريقة نمط Node.js ، مع ربطها اختياريًا بالمتغيرات المتغيرة. مثال:

var Kitty = mongoose.model("Kitty");
var findKitties = Q.nbind(Kitty.find, Kitty);

findKitties({ cute: true }).done(function (theKitties) {

});

Q.nfapply (nodeFunc ، args)

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

Q.nfapply(FS.readFile, ["foo.txt", "utf-8"]).done(function (text) {
});

لاحظ أن هذا المثال يعمل فقط لأن FS.readFile عبارة عن دالة تم تصديرها من وحدة نمطية ، وليس طريقة على كائن. بالنسبة للأساليب ، على سبيل المثال redisClient.get ، يجب ربط الطريقة بمثيل قبل تمريره إلى Q.nfapply (أو بصفة عامة كوسيطة لأي مكالمة دالة):

Q.nfapply(redisClient.get.bind(redisClient), ["user:1:id"]).done(function (user) {
});

تتمثل الإستراتيجية الأفضل للطرق في استخدام Q.npost ، كما هو موضح أدناه.

Q.nfcall (func، ... args)

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

Q.nfcall(FS.readFile, "foo.txt", "utf-8").done(function (text) {
});

ينطبق نفس التحذير على الوظائف مقابل الطرق على nfcall كما هو الحال بالنسبة nfapply . في هذه الحالة ، ستكون الإستراتيجية الأفضل هي استخدام Q.ninvoke .

Q.npost (object، methodName، args)

الاسم المستعار Q.nmapply : Q.nmapply

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

Q.npost(redisClient, "get", ["user:1:id"]).done(function (user) {
});

Q.ninvoke (object، methodName، ... args)

الاسم المستعار: Q.nsend

الاسم المستعار Q.nmcall : Q.nmcall

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

Q.ninvoke(redisClient, "get", "user:1:id").done(function (user) {
});

promise.nodeify (رد)

إذا كانت وظيفة callback هي وظيفة ، فستفترض أنها عبارة عن استدعاء Node.js ، وتطلق عليها اسم callback(rejectionReason) عندما يتم رفض promise ، أو callback(null, fulfillmentValue) عندما / إذا تم promise . إذا لم تكن وظيفة callback وظيفة ، فما عليك سوى إرجاع promise .

تفيد هذه الطريقة في إنشاء واجهات برمجة التطبيقات الوعد / معاودة الاتصال ، أي واجهات برمجة التطبيقات التي تعرض الوعود ولكنها تقبل أيضًا عمليات رد الاتصال على نمط Node.js. فمثلا:

function createUser(userName, userData, callback) {
  return database.ensureUserNameNotTaken(userName)
  .then(function () {
    return database.saveUserData(userName, userData);
  })
  .nodeify(callback);
}

deferred.makeNodeResolver ()

تقوم بإرجاع دالة مناسبة للتمرير إلى واجهة برمجة تطبيقات Node.js. بمعنى ، أنه يحتوي على توقيع (err, result) ويرفض deferred.promise مع err إذا أعطيت err ، أو تحقيقه مع result إذا تم ذلك.

مولدات كهرباء

هذه الوظيفة تجريبية.

Q.async (generatorFunction)

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

Q.spawn (generatorFunction)

يعمل هذا على الفور على وظيفة مولد ، ويعيد توجيه أي أخطاء لم يتم Q.onerror إلى Q.onerror . يتم اعتبار حدوث خطأ غير معلوم إذا أرجعت الدالة وعدًا مرفوضًا. لاحظ أن هذا يحدث تلقائيًا في حالة قيام وظيفة المولد بطرح خطأ ، على سبيل المثال عن طريق yield على yield يتم رفضه دون إحاطة هذا الرمز try / catch :

Q.spawn(function* () {
  // If `createUser` returns a rejected promise, the rejection reason will
  // reach `Q.onerror`.
  var user = yield createUser();
  showUserInUI(user);
});

خطأ معالجة وتتبع

Q.onerror

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

Q.getUnhandledReasons ()

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

Q.stopUnhandledRejectionTracking ()

يوقف تتبع الرفض غير المعالج ، مما يوفر زيادة طفيفة في الكفاءة إذا لم تجد معلومات تصحيح الأخطاء هذه مفيدة. كما يمنع Q من طباعة أي أسباب رفض غير معالَجة عند الخروج من العملية في Node.js.

Q.resetUnhandledRejections ()

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

آخر

Q.isPromise (القيمة)

إرجاع ما إذا كانت القيمة المعطاة هي وعد Q.

Q.isPromiseAlike (القيمة)

إرجاع ما إذا كانت القيمة المعطاة تعد بمثابة وعد (بمعنى أنه كائن به وظيفة then ).

Q.promised (ظائفها)

ينشئ إصدارًا جديدًا من func يوافق على أي مجموعة من الوعود والقيم غير الوعدية ، ويحولها إلى قيم تنفيذها قبل استدعاء func الأصلي. كما تعيد النسخة المرتجعة وعدًا أيضًا: إذا Q.promised(func) return أو throw ، فإن Q.promised(func) سيعود بالوعد الذي تم الوفاء به أو رفضه ، على التوالي.

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

Q.longStackSupport

خاصية قابلة للتثبيت تتيح لك تشغيل دعم تتبع المكدس الطويل. إذا تم تشغيله ، سيتم تعقب "قفزات المكدس" عبر عمليات التزام غير متزامنة ، بحيث إذا تم طرح خطأ لم يتم done قبل أو تم فحص خاصية stack لسبب رفض في رد اتصال رفض ، يتم إنشاء تتبع مكدس طويل.

واجهة برمجة تطبيقات المراسلة المخصصة (متقدم)

يقوم منشئ Q إنشاء واجهة برمجة التطبيقات الأساسية لإجراء عمليات على الكائنات: "get" و "put" و "del" و "post" و "apply" و "keys". يمكن تمديد هذه المجموعة من "المشغلين" عن طريق إنشاء وعود تستجيب للرسائل مع أسماء المشغلين الآخرين ، وعن طريق إرسال رسائل مقابلة لتلك الوعود.

promise.dispatch (المشغل ، args)

يرسل رسالة تعسفية إلى وعد ، مع مجموعة معينة من الحجج.

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