Выполнение заданий в повестке дня с асинхронным ожиданием - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть несколько модулей и моделей, которые разделены.Теперь я хочу добавить agenda для запуска заданий в режиме планирования.когда я кодирую в sync все работает нормально, но я хочу обработать это с async и await.вот мой код:

import {User} из 'models';

module.exports = async function (agenda) {
    agenda.define('userjob', async (job) => {
        console.log(`running job  for user: ${job.attrs.data.userId}`);
        const user = await User.findOne({ _id: job.attrs.data.userId });
        console.log(user);
    });
};

и в моем anenda индексном файле:

import Agenda from 'agenda';

   const agenda = new Agenda({ db: { address: mongo } });
agenda.on('success', (job) => {
    console.log(`job ${job.attrs.name} was successfull.`);
});

и внекоторые из моих маршрутов (только для теста) я называю так:

agenda.now('userjob', { name: 'name job', userId: '5bf993f11ad57c4dd9edcd74' });

проблема здесь в том, что мой user объект, когда я регистрирую его

const agenda = new Agenda({ db: { address: mongo } });

agenda.on('ready', () => {
    console.log('agenda is ready.');
});

agenda.on('start', async (job) => {
    console.log(`job ${job.attrs.name} is started.`);
});

agenda.on('complete', (job) => {
    console.log(`job ${job.attrs.name} is finished.`);
});

agenda.on('success', (job) => {
    console.log(`job ${job.attrs.name} was successfull.`);
});

agenda.on('error', (job) => {
    console.log(`job ${job.attrs.name} was failed.`);
});

jobTypes.forEach((type) => {
    require(`./jobs/${type}`)(agenda);
});



(async function () {
    if (jobTypes.length) {
        await agenda.start();
    }
}());


async function graceful() {
    await agenda.stop();
    process.exit(0);
}

process.on('SIGTERM', graceful);
process.on('SIGINT', graceful);

module.exports = agenda;

, вывод находится внеправильный порядок, я думаю:

job saveInvestore is started.
running job  for user: 5bf993f11ad57c4dd9edcd74
job saveInvestore was successfull.
job saveInvestore is finished.
{ investmentInfo:
   { fundCode: [],
     FirstName: 'test',
     LastName: 'testian',
     Email: 'test@test.test',
     Mobile: '0912121212',
     MelliNumber: '1234554321' },
  role: 'BASIC',
  status: 'ACTIVE',
  meta: '{}',
  fundCode: [],
  _id:
   ObjectID {
     _bsontype: 'ObjectID',
     id: <Buffer 5b f9 93 f1 1a d5 7c 4d d9 ed cd 74> },
  firstName: 'test',
  lastName: 'testian',
  email: 'test@test.test',
  nationalCode: '1234554321',
  phoneNumber: '0912121212',
  gender: 'MALE',
  createdAt: 2018-11-24T18:09:53.912Z,
  updatedAt: 2018-11-24T18:09:53.912Z,
  __v: 0 }

Как мне составить повестку дня, чтобы она работала точно в том порядке, в котором ожидалась async/await работа?

1 Ответ

0 голосов
/ 22 февраля 2019

Повестка дня внедряет второй параметр done в ваш обработчик работы, это обратный вызов, который вы должны вызывать, когда ваша работа заканчивается.

module.exports = async function (agenda) {
    agenda.define('userjob', async (job, done) => {
        console.log(`running job  for user: ${job.attrs.data.userId}`);
        const user = await User.findOne({ _id: job.attrs.data.userId });
        console.log(user);
        // Now your async/await job works!
        return done();
    });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...