nodejs与q

时间:2015-07-02 00:08:01

标签: node.js express sync

我用http get来获取一个json,但是无法将它传递给首页,即使我已经使用过q,也可以执行同步,但仍然存在问题,任何人都可以提供帮助吗? //getturnto.js

    var conf = require("../conf/setting.json");
    var http = require("http");

    function TurnToUGC(){
        if(!(this instanceof TurnToUGC)){
            return new TurnToUGC();
        }
    };

    TurnToUGC.prototype.getUGCJson = function(item,callback){            
        var UGCPath = conf.UGCPath;
        var options = {
            host:conf.UGCHost,
            port:conf.UGCPort,
            path:UGCPath
        };
        http.get(options,function(res){
            var buf = "";
            res.on("data",function(d){
                buf += d;
            });
            res.on("error",function(error){
                callback(error);
            });
            res.on("end", function () {
                var ret;
                try{
                    ret = JSON.parse(buf);
                }catch (err){
                    return callback(err);
                }
                callback(null,ret);
            })
        }).on("error",function(er){
            console.log(er);
        });
    };
    module.exports = TurnToUGC;

然后我要显示它,(我使用express生成一个简单的网页) //这是router.index

    var q = require("q");
    exports.index = function(req, res,next){
        var getturnto = require("getturnto")();
        q().then(function(){
            getturnto.getUGCJson(null,function(err,re){
                if(err){
                    console.log(err);
                    return {"error":err};
                }else {
                    console.log(re);
                    return re;
                }
            });
        })
            .then(function(UGCData){
                res.render('index',
                    { title: 'Get UGC Content',
                        data:UGCData
                    }
                );
            })
            .fail(function(err){
                console.log(err);
                next(err);
            });
    }

json可以在控制台中打印出来,但是" UGCData"始终未定义,并且json对象无法传递到首页。

2 个答案:

答案 0 :(得分:0)

请阅读承诺传播here。由于您的getturnto.getUGCJson是异步的,因此第一个输出处理程序返回undefined。这就是你在UGCData中未定义的原因。你要做的是在第一个输出处理程序中返回一个promise。试试这个:

var q = require("q");
exports.index = function(req, res,next){
    var getturnto = require("getturnto")();
    q().then(function(){
        var deferred = q.defer();
        getturnto.getUGCJson(null,function(err,re){
            if(err){
                console.log(err);
                deferred.reject(new Error(error));
            }else {
                console.log(re);
                deferred.resolve(re);
            }
        });
        return deferred.promise;
    })
        .then(function(UGCData){
            res.render('index',
                { title: 'Get UGC Content',
                    data:UGCData
                }
            );
        })
        .fail(function(err){
            console.log(err);
            next(err);
        });
}

如果你重写getUGCJson以返回承诺会更好。

答案 1 :(得分:0)

最终版本: 1.getturnto.js

.....

    TurnToUGC.prototype.getUGCJson = function(){         

        *var deferred = q.defer();*

        http.get(options,function(res){
            ....
            res.on("error",function(error){
                *deferred.reject(new Error(error))*;
            });
            res.on("end", function () {
                try{
                    *deferred.resolve(JSON.parse(buf));*
                }catch (err){
                    console.log(err);
                }
            })
        }).on("error",function(er){
            console.log(er);
        });
        *return deferred.promise;*
    };

    module.exports = TurnToUGC;

2.router

     getturnto.getUGCJson(null).then(function(UGCData){
            res.render('index',
                { title: 'Get UGC Content',
                    data:UGCData,
                    comments:UGCData.comments,
                    questions:UGCData.questions
                }
            );
    })
    .fail(function(err){
        console.log(err);
        next(err);
    });
    }