有没有办法在NodeJS中优先处理异步调用?

时间:2018-03-19 13:55:47

标签: node.js node-red loopback event-loop

我正在尝试对Node-Red Node的输入事件进行I / O(db)调用。所以,如果我有很多输入事件,所有对db的调用都会被添加到回调队列中,并且只有在调用堆栈上没有任何内容后才会被处理。
这就是加入内存而后我的内存堆积不足一些50K输入事件,因为我需要将I / O的响应发送到下一个节点,所以进程停止。
有什么方法可以优先处理回调队列中的进程,以便它不会堆积?
代码:

    node.on('input', function (msg) {

        console.log("before create");

            app.models.ModelName.create(msg.payload, function (err, response) {
                            if(err){
                               return  node.error(err);
                            }
                            console.log("after create")

                            ///Process the response before sending
                                    msg.payload.msg_num = response.msg_num;

                                    node.send(msg);

                            })

            });

输出: 在创建之前 在创建之前 在创建之前 在创建之前 在创建之前 在创建之前 。


(N次)
创建后 创建后 创建后 创建后 创建后 创建后 创建后 。


(N次)

在执行所有输入事件之前,有没有办法让create()实际执行?

2 个答案:

答案 0 :(得分:1)

TLDR;否

没有回调队列,它是所有一个事件队列,并按顺序处理任务。这里的问题是数据库需要更长的时间来回复,而不是注入所有输入数据,因此所有输入都会在数据库处理足够的内存以释放足够的内存之前到达并烧掉内存。

解决这个问题的唯一方法就是在注入消息的过程中引入一些背压。例如如果它是HTTP-in / HTTP-out对只允许一定数量的飞行会话。

答案 1 :(得分:0)

我认为在这种情况下,你可以使用。

https://caolan.github.io/async/docs.html#each

使用回调函数完成该过程。