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;
});