在node.js线程循环外运行代码

时间:2016-04-10 11:45:34

标签: node.js event-loop

我是node.js的新手。 我已经研究过如何在google上的node.js线程循环(事件循环)之外运行我的代码,但无法得到答案。

如何创建在节点事件循环外运行的函数。 例如,在mongoose中,它使用

scheme.save(function(err)){ 
  console.log('saved');
});

插入数据,其中节点在事件循环外运行插入代码(保存函数),然后返回到事件循环以运行我的回调(在上面的示例中,执行一些日志记录)。

我试试

  function getUser(id, callback) {
    setTimeout(function() {
      console.log('executed');
      callback(null, "jhon");
    }, 5000); 
  }

  function display(err,user) {
      console.log(user);
  }

  getUser(432, display);
  console.log('this show first');

但它同步运行(它在处理新请求之前阻止事件循环5秒)。

如何实现相同的“保存”功能,以便它不会在上面的代码中阻止事件循环5秒? 任何要阅读的主题? 感谢。

1 个答案:

答案 0 :(得分:0)

正如@SteveCampbell所说 - 假设setTimeout(function() { /// }, 5000)将阻止事件循环,你错了 - 它不会。 它将仅延迟执行函数内部代码5秒

虽然持续5秒,但NodeJS引擎完全可以运行,可以执行其他操作,接收和发送网络请求以及执行任何其他I / O.

enter image description here 检查NodeJS事件循环性质上的那些资源以及正确使用它的方法:

UPD

"代码,如获取rss数据" - 再次仅创建任务并添加在任务完成时执行的回调。它没有阻止任何东西,这是NodeJS异步代码背后的主要酷想法。 点击example rss reader in NodeJS

//1 - task configuration
var req = request('http://somefeedurl.xml')
  , feedparser = new FeedParser([options]);

// here while rss is being retrieved in a separate sub task
// nodejs engine can do other tasks

//2- callback for error
req.on('error', function (error) {
  // handle any request errors
});
//2- callback for response with data 
req.on('response', function (res) {
 //...