DanLevy.net

مزالق Promise

تجنب الأخطاء الشائعة

Hero image for مزالق Promise

لا تعمل الـ Promises مثل القيم الأخرى

لا يمكنك طباعة قيمتها مثل معظم القيم:

// هذا غير منطقي مع الـ Promises:
console.log(Promise.resolve(42));
// يجب استخدام واجهة `.then`:
Promise.resolve(42).then(value => console.log(value));

لا تحذرك الـ Promises عند ارتكاب خطأ

حسنًا، خطأ محتمل.

لأسباب متعددة، قررت TC39 أنه يمكن تمرير null إلى .then و .catch. على سبيل المثال، .then(null, null) صحيح والسلوك المطلوب هو تخطي تلك ‘الخطوة’ في السلسلة.

النتيجة غير المحظوظة لهذا هي أنه من السهل جدًا إفساد الأمور.

بالمثال

لننظر إلى تحدي صغير: أي من الخيارات التالية سيطبع console.log القيمة 42؟

// الخيار #1:
Promise.resolve(42).then(console.log());
// الخيار #2:
Promise.resolve(42).then(console.log);
// الخيار #3:
Promise.resolve(42).then(value => console.log(value));
// الخيار #4:
Promise.resolve(42)
.then(console.log())
.then(console.log);
الإجابة

الإجابة هي #2 و #3 و #4.

لماذا؟ دعنا ننظر إلى أنواع ما تم تمريره إلى .then():

var arg1 = console.log();
var arg2 = console.log;
var arg3 = value => console.log(value);
typeof arg1 === "undefined";
typeof arg2 === "function";
typeof arg3 === "function";

هل ما زلت تتساءل كيف يعمل الخيار الرابع؟

إنه يعمل بشكل فعال كما يلي:

// الخيار #4 - بشكل فعال
Promise.resolve(42)
.then(undefined) // هذا لا يؤثر على القيمة، سيتم تمريرها إلى `.then(fn)` التالي
.then(console.log);