2016-04-10 22 views
0

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

我如何创建一个运行在节点事件循环之外的函数。 例如,在猫鼬,它使用

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秒? 任何主题阅读? 谢谢。

+0

为什么你认为它阻止事件循环? –

+0

请阅读更新的问题。 我尝试在2个分开的选项卡上运行上面的代码。并且在第一个'jhon'日志出现后记录第二个日志'this show first'。是iam做错了吗? – gitong0315

+0

它打印出类似这样: “这个节目第一” “JHON” “本次车展第一” “JHON” 代替 '本次车展第一 本次车展第一 约翰 john' – gitong0315

回答

0

正如@SteveCampbell所说 - 你错了,假设setTimeout(function() { /// }, 5000)将BLOCK事件循环 - 它不会。 它会只是延迟执行功能内的代码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) { 
//... 
+0

请阅读更新的问题。我尝试在2个分离的选项卡上运行上面的代码。并且在第一个'jhon'日志出现后记录第二个日志'this show first'。 \t 它打印出如下内容:“this show first”“jhon”“this show first”“jhon”而不是“this show first”“this show first”“john”“john” – gitong0315

+0

如果在getUser函数中iam做一些长时间运行的代码,如获取rss数据?它会阻止它的事件循环还是自动为我创建新流程?这是真正的问题。 settimeout只是我的方法来模拟长时间运行的代码 – gitong0315

+0

检查更新的答案 – shershen