ما هو إصدار غير متزامن الذي تستخدمه؟
الإصدار 2.5.0
ما البيئة التي حدثت فيها المشكلة في (إصدار العقدة / إصدار المتصفح)
الإصدار 6.0.3
ما الذي فعلته؟
async.auto({
returnOne: (callback) => callback(null, 1),
tryCatch: ["returnOne", (results, callback) => {
try {
assert(results.returnOne === 1);
return callback(null);
} catch (err) {
console.log(`Caught an error: ${err.message}`);
return callback(err);
}
}],
}, (err, results) => {
assert(results.returnOne !== 1);
console.log(`All Done!`);
});
ماذا تتوقع أن يحدث؟
يفشل التأكيد الموجود داخل رد نداء aync.auto النهائي ويلقي خطأ لم يتم اكتشافه ويوقف عملية Node.js. في مثال العالم الحقيقي الخاص بي على هذا ، نقوم باختبار كتلة من التعليمات البرمجية داخل Mocha ، والتي تعالج الخطأ وتبلغ عن فشل الاختبار بمعلومات حول التأكيد الذي تسبب في الفشل.
ماذا كانت النتيجة الفعلية؟
حاول / Catch من الخطوة التلقائية السابقة اكتشاف الخطأ واستدعاء رد نداء tryCatch مرة ثانية ، مما يؤدي إلى خطأ مختلف:
async/dist/async.js:903
if (fn === null) throw new Error("Callback was already called.");
^
Error: Callback was already called.
try {
//...
return callback(null, result)
} catch (e) {
//..
return callback(e)
}
هو نموذج مضاد ضخم لأنه إذا تم طرح شيء ما لاحقًا في سلسلة رد الاتصال (مثل تأكيدك) ، فسيتم اكتشافه في كتلة try
، مما يتسبب في رد اتصال مزدوج في catch
. طريقة صحيحة:
let err, result
try {
result = doSomething()
} catch (e) {
err = e
}
callback(err, result)
aearly من المنطقي ، شكرًا على النصيحة!
(مرحبًا أيضًا! 👋)
👋😊
التعليق الأكثر فائدة
هو نموذج مضاد ضخم لأنه إذا تم طرح شيء ما لاحقًا في سلسلة رد الاتصال (مثل تأكيدك) ، فسيتم اكتشافه في كتلة
try
، مما يتسبب في رد اتصال مزدوج فيcatch
. طريقة صحيحة: