JavaScript从函数返回值

时间:2013-12-04 04:55:38

标签: javascript node.js express

人们,跟随一些代码并没有正确地返回'baz'。它说它未定义。为什么呢?

getJSON = function(options, onResult)
{
    //console.log("rest::getJSON");
    var prot = options.port == 8443 ? https : http;
    var req = prot.request(options, function(res)
    {
        var output = '';
        console.log(options.host + ':' + res.statusCode);
        res.setEncoding('utf8');

        res.on('data', function (chunk) {
            output += chunk;
        });

        res.on('end', function() {
            var obj = JSON.parse(output);
            onResult(res.statusCode, obj);
        });
    });
    req.on('error', function(err) {
        //res.send('error: ' + err.message);
    });
    req.end();
};

exports.Search = function(req, res){
    if (!req.session.username) {
        res.redirect('/login');
    } else {

        options = {
            host: 'api.host.com',
            port: 443,
            path: '/ver/foo/'+req.body.bar,
            method: 'GET',
            rejectUnauthorized: false,
            requestCert: true,
            agent: false,
            headers: {
                'Content-Type': 'application/json'
                }
        };

        var baz = getJSON(options,function(statusCode, result) {
            console.log("onResult: (" + statusCode + ")" + JSON.stringify(result));
            // Check if User Exists
            status = JSON.stringify(result.Count)
            status = JSON.parse(status)
            if (status == 0) {
                res.render('foo/bar', { title: 'Title', Results: status, req: req });
            } else {
                results = JSON.stringify(result.Items)
                results = JSON.parse(results)
                name = results[0].name.S
                console.log("Found ",name)
                res.render('views/bar', { title: 'title', results: results, req: req });
            }
            baz = 'test';
            return baz;
        });
    }
 console.log(baz);
};

1 个答案:

答案 0 :(得分:4)

您无法像正在尝试的那样从异步成功处理程序返回结果。该操作是异步的。 getJSON函数返回后,它完成LONG。因此,getJSON函数返回时没有返回结果。

getJSON调用只是STARTS操作,然后getJSON调用完成执行,然后一段时间后,getJSON调用完成并执行回调。从回调函数返回值只是进入异步基础结构的内容并被忽略。它不会在任何地方找到你的代码。

使用异步结果的唯一方法是使用成功处理程序中的值或从成功处理程序中调用函数,并将该函数传递给刚收到的数据。

如果要使用异步网络调用,则必须以异步方式编程。这需要重新编写代码流,而不能以典型的顺序方式编写代码。