NodeJS回调范围问题

Nic*_*erg 2 javascript callback node.js express

我很新(本周刚刚开始)到Node.js并且有一个基本的部分我无法理解.我有一个辅助函数,它调用MySQL数据库来获取一些信息.然后我使用回调函数将数据返回给调用者,但是当我想在该回调之外使用该数据时,我遇到了麻烦.这是代码:

    /** Helper Function **/
    function getCompanyId(token, callback) {
            var query = db.query('SELECT * FROM companies WHERE token = ?', token, function(err, result) {
                var count = Object.keys(result).length;

                if(count == 0) {
                    return;
                } else {
                    callback(null, result[0].api_id);
                }
            });
        }

/*** Function which uses the data from the helper function ***/
    api.post('/alert', function(request, response) {
        var data = JSON.parse(request.body.data);
        var token = data.token;

        getCompanyId(token, function(err, result) {
            // this works
            console.log(result);
        });

        // the problem is that I need result here so that I can use it else where in this function.
    });
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,只要我保持在回调范围内,我就可以访问getCompanyId()的返回值,但我需要在回调之外使用该值.我能够在另一个函数中解决这个问题,只需将所有逻辑都放在回调中,但在这种情况下不起作用.任何关于如何更好地构建这一点的见解都将是最受欢迎的.到目前为止我真的很喜欢Node.js,但显然我有很多学习要做.

joe*_*ews 5

简短的回答 - 如果不违反Node.js的异步性质,你就不能这样做.

考虑尝试访问result回调之外的后果- 如果您需要使用该值,并且回调尚未运行,您将做什么?您不能sleep等待设置值 - 这与Node的单线程,事件驱动设计不兼容.您的整个程序必须在等待回调运行时停止执行.

任何依赖的代码result都应该在getCompanyId回调中:

api.post('/alert', function(request, response) {
    var data = JSON.parse(request.body.data);
    var token = data.token;

    getCompanyId(token, function(err, result) {
        //Any logic that depends on result has to be nested in here
    });
});
Run Code Online (Sandbox Code Playgroud)

学习Node.js(以及异步编程是一般的)最困难的部分之一是学习异步思考.一开始可能很难,但值得坚持.您可以尝试在程序上进行战斗和编码,但这将不可避免地导致无法维护,错综复杂的代码.

如果你不喜欢多个嵌套回调的想法,你可以查看promises,它允许你将方法链接在一起而不是嵌套它们.本文是一个很好的介绍Q,一个承诺的实现.