لذا لدي وظيفتان غير متزامنتين / انتظار وأرغب في وضعهما في قائمة الانتظار. يتم إطلاقها "عشوائياً" على أحداث محددة بمقبس الويب ولكن يجب تشغيلها واحدة تلو الأخرى. لذلك أنا أختبر هذا باستخدام هذا الرمز.
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()
في النهاية.
هل أفعل شيئًا خاطئًا أم أن هذه المكتبة ليست مناسبة لي؟
مرحبًا codeofsumit ، شكرًا على السؤال!
من خلال النظر في التعليمات البرمجية الخاصة بك ، أعتقد أن المشكلة تتعلق بالأسطر الثلاثة الأخيرة. أنت تستدعي الدوال ، وتدفع قيمتها المرتجعة إلى queue
بدلاً من دفع الدوال إلى queue
. راجع مستندات QueueObject
لمزيد من المعلومات حول q.push
. حاول تغييرها إلى:
q.push(aida.launch);
q.push(aida.login);
q.push(aida.goToMonth);
نظرًا لأن لديك concurrency
من 1
، فإن قائمة الانتظار ستعالج login
بعد انتهاء launch
.
hargasinski اعتقدت ذلك وحاولت ذلك ولكن هذا يجلب سؤالين جديدين:
codeofsumit آسف ، أدركت أن تعليقي السابق كان مضللاً بعض الشيء ، لقد queue
مع وظيفة مختلفة. آمل أن أتمكن من التوضيح.
- كيف تبدأ قائمة الانتظار؟ لا يبدو أنه بدأ بعد الدفعة الأولى
يجب أن يبدأ queue
عندما يحصل على task
، أي عندما تتصل بـ q.push
. هل يمكنك تقديم عينة رمز؟ تم تشغيل الكود أعلاه بالنسبة لي.
ملاحظة جانبية: إذا كنت تستخدم وظائف es7 async
مع async
وترجمة الكود الخاص بك ، فسيتعين عليك لفها بـ async.asyncify
. انظر الى هذا التعليق لمزيد من المعلومات.
- كيف يمكنني تمرير المعلمات إلى الوظائف؟
هذا هو المكان الذي كنت في حيرة من أمري. 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: []});
نأمل أن يكون هذا أوضح قليلاً.
أه هذا يبدو واعدًا جدًا. شكرًا لك على الوقت الذي قضيته في شرحه بهذه التفاصيل. يساعد كثيرا!
أيضًا: لقد لاحظت أنك تحل المشكلات في هذا الريبو سريعًا جدًا (ليس هناك الكثير من المشكلات المفتوحة لمثل هذه المكتبة الشعبية). 👍 مثير للإعجاب - استمر في العمل الجيد!
التعليق الأكثر فائدة
codeofsumit آسف ، أدركت أن تعليقي السابق كان مضللاً بعض الشيء ، لقد
queue
مع وظيفة مختلفة. آمل أن أتمكن من التوضيح.يجب أن يبدأ
queue
عندما يحصل علىtask
، أي عندما تتصل بـq.push
. هل يمكنك تقديم عينة رمز؟ تم تشغيل الكود أعلاه بالنسبة لي.ملاحظة جانبية: إذا كنت تستخدم وظائف es7
async
معasync
وترجمة الكود الخاص بك ، فسيتعين عليك لفها بـasync.asyncify
. انظر الى هذا التعليق لمزيد من المعلومات.هذا هو المكان الذي كنت في حيرة من أمري.
worker
الذي تمرره إلىasync.queue
عند إنشائه ، هو المسؤول عن معالجة المهمة. إذا كنت بحاجة إلى تشغيلlaunch
وlogin
وgoToMonth
لكل حدث من مقبس الويب ، يمكنك فقط وضع الوظيفةworker
. على سبيل المثال،خلاف ذلك ، إذا كنت بحاجة إلى وضع وظائف في قائمة انتظار ، فهذا أمر صعب بعض الشيء ، ولكن يمكنك شيئًا ما على غرار:
نأمل أن يكون هذا أوضح قليلاً.