2013-02-10 82 views
4

我一直在用Node.js编程一段时间,而且我发现自己越来越讨厌需要链接回调。例如,当您需要如图所示的数据库中的多个模型时:等待回调完成的性能影响是什么?

Person.findOne({ 'name.last': 'Ghost' }, 'name occupation', function (err, person) { 
    Schedule.findOne({'person_id': person.id }, 'events', function(err, schedule) { 
     ... 
    } 
}) 

我正在寻找此问题的解决方案。我有一个想法是做这样的事情:

function() { 
    var p; 
    var s; 
    var done = false; 

    Person.findOne(..., ..., function(err, person) { 
     p = person; 
     done = true; 
    }); 

    while(!done){} 
    done = false; 

    Schedule.findOne(..., ..., function(err, schedule) { 
     s = schedule; 
     done = true; 
    }); 

    while(!done){} 
    done = false; 

    // ... 
} 

如果我这样做我的查询,性能影响是什么?我也接受其他想法来解决这个问题。

+6

看看https://github.com/caolan/async – elclanrs 2013-02-10 02:00:26

回答

2

为了回答您最直接的问题,自旋等待回调的性能影响在于,等待回转可能会导致其他更有用的任务无论是在同一进程中还是在同一台机器上完成。如果您的应用程序在没有电源管理的单用户计算机上运行,​​这并不重要,但这些都不太可能。忙碌的等待将会破坏移动平台上的电池寿命,增加数据中心的电力成本,并使未来的代码维护者诅咒你的名字!

正如elclanrs在评论中已经建议的那样,您可以查看“async”库以帮助简化代码,但无论如何您都应该避免忙于等待。

+0

这是否意味着您永远不能从依赖回调完成的函数中返回值?例如,考虑这个: 'function test(){var p; Person.findOne(...,...,function(err,person){p = person;});返回p; }' 不能保证'test()'不会返回'undefined',是否正确? – Max 2013-02-10 02:37:45

+0

是的,这是关于它的大小。而不是返回一个结果,使该函数采取回调,当结果准备就绪时将调用该回调。这在其他SO问题中有更详细的讨论,例如:http://stackoverflow.com/questions/8592385/waiting-for-asynchronous-result – 2013-02-10 02:48:05

+0

嗯有趣。我记得在某处你可以执行'thread.processNextEvent(true)'来做一个非繁忙的等待(显然也有一些危险的副作用)。在Node中是否有与此相当的内容? – Max 2013-02-10 02:55:42