【发布时间】:2018-08-14 17:57:32
【问题描述】:
我有一个要求,我必须在返回 api 响应后运行一分钟的后台进程。那个后台进程会对mongodb做一些操作。
我的方法是,我在返回响应后为后台进程发出一个事件。
这个操作有什么最好的方法吗?请帮帮我。
谢谢,
【问题讨论】:
-
你在哪里可以做到这一点?
标签: javascript node.js mongodb mean-stack
我有一个要求,我必须在返回 api 响应后运行一分钟的后台进程。那个后台进程会对mongodb做一些操作。
我的方法是,我在返回响应后为后台进程发出一个事件。
这个操作有什么最好的方法吗?请帮帮我。
谢谢,
【问题讨论】:
标签: javascript node.js mongodb mean-stack
您可以使用 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')
})
【讨论】:
您可以将 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
});
【讨论】:
当你想对 db 进行异步调用并等待结果时,你需要使用回调或在 ES6 中使用 Promise 或 async/await。
【讨论】: