مرجع سريع

ورقة مساعدة للتحكم في التدفق غير المتزامن co

مرجع سريع لمكتبة co للتحكم في التدفق غير المتزامن عبر المولدات في Node.js: التشغيل، co.wrap، دوال thunk، وتحويل الوعود.

· تاريخ النشر

co co هي المكتبة الكلاسيكية للتحكم في التدفق غير المتزامن القائم على المولدات (Generators) والتي مهدت الطريق لظهور صيغة async/await الحديثة في JavaScript وNode.js.

تنفيذ دوال المولدات (Generators)

const co = require('co');

co(function* () {
  const result = yield Promise.resolve(42);
  return result * 2;
}).then(val => {
  console.log(val); // 84
}).catch(err => {
  console.error(err);
});

يمكن لدالة المولد استخدام yield مع الوعود أو thunks أو المصفوفات أو كائنات الوعود. تقوم دالة co() بتنفيذ المولد بالكامل حتى اكتماله فورا.


تحويل المولد إلى دالة تعيد وعدا قابلا لإعادة الاستخدام (co.wrap)

يحول دالة المولد إلى دالة قياسية تعيد وعدا عاديا (مطابقة تماما لـ async function الحديثة):

const getUser = co.wrap(function* (id) {
  const user = yield db.users.findById(id);
  const posts = yield db.posts.findByUser(user.id);
  return { user, posts };
});

// يعيد الاستدعاء وعدا Promise عاديا:
getUser(123).then(data => {
  console.log(data);
});

التعامل مع دوال رد النداء في Node.js

استخدام thunkify أو مكتبات التحويل للوعود الحديثة:

const thunkify = require('thunkify');
const fs = require('fs');

const readFile = thunkify(fs.readFile);

co(function* () {
  const content = yield readFile('config.json', 'utf8');
  console.log(JSON.parse(content));
});

التنفيذ المتوازي (المصفوفات والكائنات)

co(function* () {
  // حل متوازٍ داخل مصفوفة
  const [user, profile] = yield [fetchUser(), fetchProfile()];

  // حل متوازٍ داخل كائن
  const data = yield {
    user: fetchUser(),
    profile: fetchProfile()
  };
  console.log(data.user, data.profile);
});

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