مرجع سريع

ورقة مساعدة لمكتبة الوعود Bluebird.js

مرجع سريع لـ Bluebird.js: أسلوب spread، التقاط الأخطاء، Promise.join، Promise.all، Promise.props، التحويل إلى وعود، والروتينات المساعدة.

· تاريخ النشر

Bluebird Bluebird هي مكتبة Promise عالية الأداء وغنية بالميزات المتقدمة لبيئة JavaScript وNode.js.

نظرة عامة على ربط التوابع (Method Chaining)

promise
  .then(okFn, errFn)
  .spread(okFn, errFn)        // * تفكيك عناصر المصفوفة إلى معاملات دالة
  .catch(errFn)
  .catch(TypeError, errFn)    // * التقاط أخطاء مخصص حسب النوع
  .finally(fn)
  .map(function (e) { /* ... */ })  // * تكرار متزامن متحكم به
  .each(function (e) { /* ... */ }) // * تكرار تسلسلي بالترتيب

التوابع المميزة بعلامة * هي إضافات خاصة بـ Bluebird تتجاوز مواصفات ES6 Promise القياسية.


تعدد المعاملات والفك (Promise.spread)

Promise.resolve(['foo', 'bar'])
  .spread((item1, item2) => {
    console.log(item1, item2); // 'foo', 'bar'
  });

راجع: توثيق Promise.spread: Promise.spread


دمج الوعود المحددة (Promise.join)

تنسيق عدة وعود مستقلة مع توقيع معالجة ثابت:

Promise.join(
  getPictures(),
  getMessages(),
  getTweets(),
  (pics, msgs, tweets) => {
    return { pics, msgs, tweets };
  }
);

راجع: توثيق Promise.join: Promise.join


توابع مصفوفات الوعود

  • Promise.all([p]): يتم حله عند حل جميع الوعود بنجاح، أو يرفض فورا عند أول خطأ.
  • Promise.some([p], count): يتم حله عند تسوية عدد محدد من الوعود بنجاح.
  • Promise.any([p]): يتم حله بمجرد تسوية أي وعد فردي بنجاح.
  • Promise.map(array, fn, { concurrency: 5 }): يعالج العناصر بتكرار متزامن محدد العدد.
Promise.map(urls, url => fetch(url), { concurrency: 3 })
  .then(responses => {
    // معالجة الاستجابات بحد أقصى 3 طلبات متزامنة
  });

وعود الكائنات (Promise.props)

يقوم بحل كائن يحتوي على قيم وعود إلى كائن بنفس الخصائص بعد حل قيمها:

Promise.props({
  photos: getPhotos(),
  posts: getPosts()
}).then(result => {
  console.log(result.photos, result.posts);
});

التحويل إلى وعود (Promisification)

تحويل دوال رد النداء (callbacks) القديمة في Node.js إلى وعود Promises حديثة:

const fs = require('fs');
const Promise = require('bluebird');

// تحويل دالة واحدة فقط
const readFile = Promise.promisify(fs.readFile);

// تحويل وحدة نمطية بالكامل دفعة واحدة
Promise.promisifyAll(fs);
// أصبحت fs.readFileAsync متاحة الآن للاستخدام المباشر

الروتينات المساعدة والمولدات (Coroutines)

const loginUser = Promise.coroutine(function* (email, password) {
  const user = yield User.findOne({ email }).exec();
  const valid = yield user.comparePassword(password);
  if (!valid) throw new Error('Invalid credentials');
  return user;
});

موضوعات ذات صلة