Async: كيفية وضع وظائف غير متزامنة في قائمة انتظار es6

تم إنشاؤها على ١٢ مايو ٢٠١٧  ·  4تعليقات  ·  مصدر: caolan/async

لذا لدي وظيفتان غير متزامنتين / انتظار وأرغب في وضعهما في قائمة الانتظار. يتم إطلاقها "عشوائياً" على أحداث محددة بمقبس الويب ولكن يجب تشغيلها واحدة تلو الأخرى. لذلك أنا أختبر هذا باستخدام هذا الرمز.

const aida = {
  async launch() {
    await someFunction();
  },
  async login() {
    await Auth();
    await UserSettings();
  },
  async goToMonth() {
    await JumpToDefaultMonth();
  }
};


const q = async.queue(function(task, callback) {
  console.log('hello ' + task.name);
  callback();
}, 1);

q.drain = function() {
  console.log('all items have been processed');
};

q.push(aida.launch());
q.push(aida.login());
q.push(aida.goToMonth());

أتوقع على سبيل المثال أن login() يعمل فقط بعد launch() في النهاية.
هل أفعل شيئًا خاطئًا أم أن هذه المكتبة ليست مناسبة لي؟

question queue

التعليق الأكثر فائدة

codeofsumit آسف ، أدركت أن تعليقي السابق كان مضللاً بعض الشيء ، لقد queue مع وظيفة مختلفة. آمل أن أتمكن من التوضيح.

  1. كيف تبدأ قائمة الانتظار؟ لا يبدو أنه بدأ بعد الدفعة الأولى

يجب أن يبدأ queue عندما يحصل على task ، أي عندما تتصل بـ q.push . هل يمكنك تقديم عينة رمز؟ تم تشغيل الكود أعلاه بالنسبة لي.

ملاحظة جانبية: إذا كنت تستخدم وظائف es7 async مع async وترجمة الكود الخاص بك ، فسيتعين عليك لفها بـ async.asyncify . انظر الى هذا التعليق لمزيد من المعلومات.

  1. كيف يمكنني تمرير المعلمات إلى الوظائف؟

هذا هو المكان الذي كنت في حيرة من أمري. worker الذي تمرره إلى async.queue عند إنشائه ، هو المسؤول عن معالجة المهمة. إذا كنت بحاجة إلى تشغيل launch و login و goToMonth لكل حدث من مقبس الويب ، يمكنك فقط وضع الوظيفة worker . على سبيل المثال،

const q = async.queue(function(task, callback) {
  async.series([
    async function() {
      await aida.launch(task.foo, task.boo);
    },
    async function() {
      await aida.login(task.baz);
    },
    // etc...
  ], callback);
}, 1);

// on a websocket event
q.push({foo: websocketData.foo, bar: websocketData.bar, baz: websocketData.baz});

خلاف ذلك ، إذا كنت بحاجة إلى وضع وظائف في قائمة انتظار ، فهذا أمر صعب بعض الشيء ، ولكن يمكنك شيئًا ما على غرار:

const q = async.queue(async function(task) {
  await task.func.apply(null, task.args);
}, 1);

// on a websocket event
q.push({func: aida.launch, args: [websocketData.foo, websocketData.bar]});
q.push({func: aida.login, args: [websocketData.baz]});
q.push({func: aida.goToMonth, args: []});

نأمل أن يكون هذا أوضح قليلاً.

ال 4 كومينتر

مرحبًا codeofsumit ، شكرًا على السؤال!

من خلال النظر في التعليمات البرمجية الخاصة بك ، أعتقد أن المشكلة تتعلق بالأسطر الثلاثة الأخيرة. أنت تستدعي الدوال ، وتدفع قيمتها المرتجعة إلى queue بدلاً من دفع الدوال إلى queue . راجع مستندات QueueObject لمزيد من المعلومات حول q.push . حاول تغييرها إلى:

q.push(aida.launch);
q.push(aida.login);
q.push(aida.goToMonth);

نظرًا لأن لديك concurrency من 1 ، فإن قائمة الانتظار ستعالج login بعد انتهاء launch .

hargasinski اعتقدت ذلك وحاولت ذلك ولكن هذا يجلب سؤالين جديدين:

  1. كيف تبدأ قائمة الانتظار؟ لا يبدو أنه بدأ بعد الدفعة الأولى
  2. كيف يمكنني تمرير المعلمات إلى الوظائف؟

codeofsumit آسف ، أدركت أن تعليقي السابق كان مضللاً بعض الشيء ، لقد queue مع وظيفة مختلفة. آمل أن أتمكن من التوضيح.

  1. كيف تبدأ قائمة الانتظار؟ لا يبدو أنه بدأ بعد الدفعة الأولى

يجب أن يبدأ queue عندما يحصل على task ، أي عندما تتصل بـ q.push . هل يمكنك تقديم عينة رمز؟ تم تشغيل الكود أعلاه بالنسبة لي.

ملاحظة جانبية: إذا كنت تستخدم وظائف es7 async مع async وترجمة الكود الخاص بك ، فسيتعين عليك لفها بـ async.asyncify . انظر الى هذا التعليق لمزيد من المعلومات.

  1. كيف يمكنني تمرير المعلمات إلى الوظائف؟

هذا هو المكان الذي كنت في حيرة من أمري. worker الذي تمرره إلى async.queue عند إنشائه ، هو المسؤول عن معالجة المهمة. إذا كنت بحاجة إلى تشغيل launch و login و goToMonth لكل حدث من مقبس الويب ، يمكنك فقط وضع الوظيفة worker . على سبيل المثال،

const q = async.queue(function(task, callback) {
  async.series([
    async function() {
      await aida.launch(task.foo, task.boo);
    },
    async function() {
      await aida.login(task.baz);
    },
    // etc...
  ], callback);
}, 1);

// on a websocket event
q.push({foo: websocketData.foo, bar: websocketData.bar, baz: websocketData.baz});

خلاف ذلك ، إذا كنت بحاجة إلى وضع وظائف في قائمة انتظار ، فهذا أمر صعب بعض الشيء ، ولكن يمكنك شيئًا ما على غرار:

const q = async.queue(async function(task) {
  await task.func.apply(null, task.args);
}, 1);

// on a websocket event
q.push({func: aida.launch, args: [websocketData.foo, websocketData.bar]});
q.push({func: aida.login, args: [websocketData.baz]});
q.push({func: aida.goToMonth, args: []});

نأمل أن يكون هذا أوضح قليلاً.

أه هذا يبدو واعدًا جدًا. شكرًا لك على الوقت الذي قضيته في شرحه بهذه التفاصيل. يساعد كثيرا!

أيضًا: لقد لاحظت أنك تحل المشكلات في هذا الريبو سريعًا جدًا (ليس هناك الكثير من المشكلات المفتوحة لمثل هذه المكتبة الشعبية). 👍 مثير للإعجاب - استمر في العمل الجيد!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات