node.js中的函数始终返回undefined

时间:2015-02-12 15:06:18

标签: javascript node.js

我是nodejs的新人,当然我看到一些指南/截屏要学习一点;但我非常关注异步/同步,读取文件以及nodejs如何处理回调/返回。例如,我无法从此请求查询中返回变量:

function call (method, parameters){
    fs.readFile("./cache/session", function(err, data){
        var pieces = data.toString().split(),
        sessionid = (method != "createsession") ? "/" + pieces[0] : "",
        vars = (!parameters) ? "/" + parameters : "",
        endpoint = "http://rest.svc/" + method + "json/";

        request({ url: endpoint}, function(error, response, body){
            if(!error) 
                return body;
        })
    })
}

'在论文',我的意思是在javascript上这将完美地工作,但在节点中总是返回undefined,我在stackoverflow上读到关于此的其他帖子,但没有人澄清我应该如此。

2 个答案:

答案 0 :(得分:3)

使用异步函数,如call要求您将回调参数传递给函数,然后回调的参数是“返回”,因为异步函数将在{{之前'返回(未定义) 1}}回应。

fs.readFile

答案 1 :(得分:1)

在函数" call()"中,启动异步任务。该任务开始后,该功能就会继续。没有别的事可做,所以它返回undefined。

现在,当异步任务调用它的回调时,回调实际上没有任何地方可以返回该值,因此它被丢弃。

要解决这个问题,你需要使用一种名为Futures或Promises的东西。我以前从未使用过这些,但他们的工作方式如下:

function call (method, parameters){
    var future = new Future();
    fs.readFile("./cache/session", function(err, data){
        var pieces = data.toString().split(),
        sessionid = (method != "createsession") ? "/" + pieces[0] : "",
        vars = (!parameters) ? "/" + parameters : "",
        endpoint = "http://rest.svc/" + method + "json/";

        request({ url: endpoint}, function(error, response, body){
            if(!error) 
                future.return(body);
            else
                future.throw(error);
        });
    });
    return future.wait();
};
相关问题