مزالق 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);