首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bull队列未完成

Bull队列未完成
EN

Stack Overflow用户
提问于 2019-05-22 20:16:41
回答 2查看 8.1K关注 0票数 3

我是bull的新手,我已经尝试过基于他们的文档代码运行公牛。进程正在启动,但是我的任务没有完成,或者不确定它是否触发了complete事件?我不确定我哪里弄错了

将我的代码附加到下面

代码语言:javascript
复制
const Queue = require('bull');

const myFirstQueue = new Queue('my-first-queue', 
{
  redis: { 
      port: Config.redis.port, 
      host: Config.redis.host, 
      password: Config.redis.password 
  },
});



(async function ad() {
    const job = await myFirstQueue.add({
    foo: 'bar',
  });
})();

myFirstQueue.process(async (job, data) => {
  log.debug({ job, data }, 'Job data');
  let progress = 0;
  for (let i = 0; i < 10; i++) {
    await doSomething(data);
    progress += 10;
    job.progress(progress).catch(err => {
      log.debug({ err }, 'Job progress err');
    });
    log.debug({ progress }, 'After await');
  }

  return job;
});

const doSomething = data => {
  return new Promise((resolve, reject) => {
    return resolve(data);
  });
};

myFirstQueue.on('completed', (job, result) => {
  log.debug(`Job completed with result ${job}`);
});


myFirstQueue.on('progress', (job, progress) => {
log.debug(`Job progress with result ${job} ${progress}`);
});

我可以看到日志,它在进度事件处理程序中,但是完成事件没有被触发。任何帮助我们都将不胜感激

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-18 12:54:13

您需要从process调用done(),然后只会触发已完成的事件。

代码语言:javascript
复制
myFirstQueue.process(async (job, done) => {
  const data = job.data;
  let progress = 0;
  for (let i = 0; i < 10; i++) {
    await doSomething(data);
    progress += 10;

    job.progress(progress).catch(err => {
      log.debug({ err }, 'Job progress err');
    });
  }

  done();
});
票数 4
EN

Stack Overflow用户

发布于 2019-10-09 22:21:32

您可以从作业对象本身获取数据,不需要向外部传递数据,处理回调需要job和data()作为参数。最后调用data()回调完成一个任务。您可以传递数据,如果某些验证失败,还可以传递错误。更好地解释https://github.com/OptimalBits/bull/blob/develop/REFERENCE.md#queueprocess

代码语言:javascript
复制
  // call done when finished
  done();

  // or give a error if error
  done(new Error('error transcoding'));

  // or pass it a result
  done(null, { framerate: 29.5 /* etc... */ });

如果不想调用done()回调,可以直接使用promise,ref-https://github.com/OptimalBits/bull#using-promises

对你的代码做了一些小的修改,希望它能有所帮助。

代码语言:javascript
复制
const Queue = require('bull');

const myFirstQueue = new Queue('my-first-queue');



(async function ad() {
    const job = await myFirstQueue.add({
    foo: 'bar',
  });
})();

myFirstQueue.process(async (job, done) => {
  log.debug( 'Job data ' + job.data);
  let progress = 0;
   for (let i = 0; i < 10; i++) {
    await doSomething(job.data);
    progress += 10;
    job.progress(progress).catch(err => {
      log.debug({ err }, 'Job progress err');
    });
    log.debug({ progress }, 'After await');
  }

  done(null, {done: job.data}); //we need this if we are not using promise
});

const doSomething = data => {
  return new Promise((resolve, reject) => {
    return resolve(data);
  });
};

myFirstQueue.on('completed', (job, result) => {
  log.debug(`Job completed with result ${job}`);
});


myFirstQueue.on('progress', (job, progress) => {
log.debug(`Job progress with result ${job} ${progress}`);
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56256609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档