如何在发送响应后在node.js api中运行后台任务?

时间:2018-03-06 19:06:46

标签: javascript node.js mongodb mean-stack

我有一个要求,我必须在返回api的响应后运行一分钟的后台进程。该后台进程将在mongodb上执行一些操作。

我的方法是,我在返回响应后发出后台进程事件。

这项操作有什么最好的方法吗?请帮帮我。

谢谢,

3 个答案:

答案 0 :(得分:0)

当你想对db进行异步调用并等待结果时,你需要在ES6中使用回调或使用promises或async / await。

read this for more info

答案 1 :(得分:0)

您可以使用EventEmitter来触发后台任务。

或者您可以在返回响应之前触发异步任务。

我会实现某种简单的内存中队列。在返回响应之前,我会向队列添加一个任务,发出一个事件告诉侦听器队列中有任务。

编辑:

我不确定我是否完全了解您的用例。但这可能是一种方法。

如果您没有引用mongo,则可能需要快速查找或创建,然后返回响应,然后运行任务

const myqueue = []

const eventHandler = new EventEmitter();

eventHandler.on('performBackgroundTask', () => {

  myqueue.forEach(task => {
    // perform task
  })

})

app.get('/api', function (req, res) {

    const identificationForItemInMongo = 123

    myqueue.push(identificationForItemInMongo)

    eventHandler.emit('performBackgroundTask',     identificationForItemInMongo)

   res.send('Send the response')
})

答案 2 :(得分:0)

您可以使用Promise链接来实现您的方法。首先呼叫Api,一旦收到响应,在UI中显示值,然后第二次呼叫将自动避开,并且不会干扰任何UI进程。您可以在此处参考有关承诺链的更多详细信息。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

var promise1 = new Promise(function(resolve, reject) {
  resolve('Success!');
});

//Run the background process.
var promise2 = new Promise(function(resolve, reject) {
  resolve('Success!');
});

promise1.then(function(value) {
  console.log(value);
  // expected output: "Success!"
  return promise2;
}).then(function(value){
  // Response for the second process completion.
}).catch(function(){
  // Failure for first api call/ second api call
});