从Callback函数中返回对象

时间:2015-12-11 21:36:05

标签: javascript node.js

这个问题听起来可能与here的问题完全重复,但我的情况却与众不同。我有getSystemIds.js这样的文件:

var system_ids_list = {};

var getSystemIDs = function(req, callback) {    
    var client = //creating an object using internally developed node library
    client.request('sql_parameter', {'Query.ID' : query_number},

                        function(err, req, res){

                                //Do some stuff to calculate necessary values

                                system_ids_list[key_value] = value_array;
                                i+= 1;
                            }
                           return(req, callback)
                        }
                    )
        };

module.exports = getSystemIDs;

现在,如上面链接中的答案所示,我在app.js

中执行此操作
   appSSL.get('/sysids', function(req, res) {
    var sys_ids = system_ids_list(req, function(err, sys_ids) {
     res.render('sysids', sys_ids);
    })
});

我没有收到任何具体的错误,但网页永远不会加载,好像某些东西卡在流程中,或者它不知道下一步该去哪里。有人可以帮我弄清楚这是最好的方法吗?

1 个答案:

答案 0 :(得分:1)

你的getSystemIds()函数永远不会调用传递给它的回调,因此getSystemIds()的调用者永远不会得到结果 - 因此请求中没有任何事情发生。

将其更改为:

var system_ids_list = {};
var getSystemIDs = function (req, callback) {
    var client = //creating an object using internally developed node library
        client.request('sql_parameter', {'Query.ID': query_number}, function (err, req, res) {
            //Do some stuff to calculate necessary values
            system_ids_list[key_value] = value_array;
            i += 1;

            // call the callback now to communicate back the async results
            callback(null, system_ids_list);
        });
};
module.exports = getSystemIDs;

您构建代码的方式,system_ids_list每次调用getSystemIDs()时都会积累越来越多的值。这似乎是构建事物的一种奇怪的方式所以我指出这一点,以防万一这不是你想要的。

此外,您的getSystemIDs()函数不会返回任何内容,因此您应该更改此内容:

appSSL.get('/sysids', function(req, res) {
    var sys_ids = system_ids_list(req, function(err, sys_ids) {
        res.render('sysids', sys_ids);
    });
});

以减少对正在发生的事情的误解:

appSSL.get('/sysids', function(req, res) {
    system_ids_list(req, function(err, sys_ids) {
        res.render('sysids', sys_ids);
    });
});

并且,如果res.render()来自ExpressJS之类的系统,那么您可能希望传递一个对象并命名一个模板:

res.render('sometemplate.html', {sysids: sys_ids});

如果您希望system_ids_list不累积值,但每次都要返回一个新值,您可以在函数中定义它,如下所示:

var getSystemIDs = function (req, callback) {
    var system_ids_list = {};
    var client = //creating an object using internally developed node library
        client.request('sql_parameter', {'Query.ID': query_number}, function (err, req, res) {
            //Do some stuff to calculate necessary values
            system_ids_list[key_value] = value_array;
            i += 1;

            // call the callback now to communicate back the async results
            callback(null, system_ids_list);
        });
};
module.exports = getSystemIDs;