Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ExpressJs(NodeJs)消防;忘记_Javascript_Node.js_Fire And Forget - Fatal编程技术网

Javascript ExpressJs(NodeJs)消防;忘记

Javascript ExpressJs(NodeJs)消防;忘记,javascript,node.js,fire-and-forget,Javascript,Node.js,Fire And Forget,我目前正在用expressjs开发api。我想写一个函数,将分析数据保存在DB中,但我应该能够以fire and forget的方式调用该函数。函数应该接受参数并执行其工作。这应该像一个单独的线程一样工作,当前的代码执行不应该等待它的响应。例如,Akka参与者在Java中的工作方式。有人可以建议一种方法或一些链接来参考吗?您可以将信息添加到某种消息队列中,然后启动另一个进程,该进程将侦听MQ并相应地处理消息 演员的工作方式并不特别重要,但在nodejs领域通常都是这样 例如,您可以使用或任何其他

我目前正在用expressjs开发api。我想写一个函数,将分析数据保存在DB中,但我应该能够以fire and forget的方式调用该函数。函数应该接受参数并执行其工作。这应该像一个单独的线程一样工作,当前的代码执行不应该等待它的响应。例如,Akka参与者在Java中的工作方式。有人可以建议一种方法或一些链接来参考吗?

您可以将信息添加到某种消息队列中,然后启动另一个进程,该进程将侦听MQ并相应地处理消息

演员的工作方式并不特别重要,但在nodejs领域通常都是这样

例如,您可以使用或任何其他可用的解决方案

// example with kue
// http-process.js
var kue = require('kue');
var queue = kue.createQueue();

... 
app.post('/something-somewhere', (req, res) => {
  var job = queue.create('event', {
    data: 'analytics, data',
    median: 5.3,
  }).save( function(err){
    if( !err ) return next(err); 

    res.send('ok');
  });
});

// event-processor.js
var kue = require('kue');
var queue = kue.createQueue();

queue.process('event', function(job, done){
  someKindOfORM.myEventsTable.insert({
    job.data
  }).notify(done);
});

默认情况下,节点是异步的。只需在db查询回调之外发送响应:

app.get("/ping", function (req, res) {
    // fire
    dbConnection.query("UPDATE analytics SET count = count + 1", function(err, result) {
        // forget
    });

    res.send("Pong");
});

哦,这是一个很好的解决方案。但是你认为承诺能在某种程度上帮助我吗?我不熟悉承诺。只是问一下。我还以为阿克卡也有承诺的概念,不是吗?基本上,承诺是处理同步代码的方式。我会为您添加样品now@SagarGopale这里有一个很好的教程来理解承诺。承诺并不是要在单独的进程中运行,而是要简化异步代码的过程。这很难解释,除非你经历了回调。谢谢你的参考链接和上面的解决方案。我想这些可以帮我解决问题。:)@SagarGopale在这里很好地解释了回调和承诺之间的区别,我相信他希望在处理错误时有更多的空间;使用MQ允许他在db insert失败时重试db insert,甚至执行一些操作preprocessing@VladMiller在这种简单的方法中,仍然有处理错误的空间。