我用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对象无法传递到首页。
答案 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);
});
}