await q.push(task)
غير آمن للاستخدام في الوقت الحالي لأن الوعد الذي قدمه q.push
لا يتم حله أو رفضه أبدًا إذا ألقى عامل قائمة الانتظار خطأ. أفهم أن await q.push(task)
لا يمكن أن يخطئ بسبب التوافق مع الإصدارات السابقة لهذه الطريقة ومعلمة رد الاتصال الاختيارية (ميزة الدفع والنسيان). طريقة q.asyncPush(task)
التي ترفض وعدها لا يجب أن تكون مجدية؟
يمكنك إظهار مشكلة هذا الرمز (في العقدة أو المتصفح دون الحاجة):
const async = require('async');
let pushResult;
(async () => {
const q = async.queue(async (task) => {
throw new Error('Bad thing');
});
try {
pushResult = q.push({some: 'data'});
await pushResult;
console.log('Error not catched');
} catch (e) {
console.log('Error catched');
}
})();
setTimeout(() => {
console.log('exit');
console.log(pushResult);
}, 1000);
_تم نشره في الأصل بواسطة https://github.com/caolan/async/pull/1641#issuecomment -498191809_
أفكر في إجراء حل q.push()
باستخدام كائن الخطأ. هل سيكون ذلك كافيا؟ لا أريد حقًا منح unhandledRejection
s للغالبية العظمى من مستخدمي queue
.
قد يكون الحل مع وجود خطأ خيارًا ولكنك ستحتاج إلى اختبار عائد q.push
، فهو ليس نمطًا تقليديًا وعدًا (لا يوجد try
/ catch
/ finally
block أو .then()
/ .catch()
يمكن استخدامها مع). الرفض المباشر ليس خيارًا ، وأنا أتفق معه ، إنه تعديل رئيسي. بالنسبة لي ، هناك احتمالان آخران:
q.asyncPush
ترجع وعدًا يمكن أن يرفضه. ربما تكون الطريقة الأسهل والأكثر وضوحًا لأنه يمكن فصل واجهات برمجة التطبيقات (APIs) الواعدة ومعاودة الاتصال بشكل كامل.q.push
لتفعيل الوعود المرفوضة.الشيء المهم حقًا هو أن الوعود لن تظل معلقة إلى الأبد ، لذا يمكنك تحديد الخيار الأفضل الذي تعتقده ؛-)
تعجبني فكرة asyncPush
.
شكرا جزيلا !
aearly هل تم تنفيذ هذا على الإطلاق؟
كان كذلك ، راجع https://caolan.github.io/async/v3/docs.html#QueueObject : pushAsync
التعليق الأكثر فائدة
تعجبني فكرة
asyncPush
.