Запуск рабочих мест в повестке дня с асинхронным / ожидающим

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

импорт {пользователь} из 'моделей';

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 Работа?

0 ответов

Повестка дня вводит второй параметр 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();
    });
};
Другие вопросы по тегам