我正在尝试实现以下方案: 1.客户呼叫流星方法。 2.在meteor-method中,我将HTTP-Post发送到不同的服务器。 3.当响应HTTP-Call时,meteor方法应该返回true,如果发生错误,它应该返回false。
以下是我的流星方法:
uploadUserImage: function(data_url,userid) {
asyncfnc =function(data,uid){
HTTP.post("http://localhost:2000/upload", {
data: {
"data_url": data,
"user_id": uid
}
},function(err,res){
console.log(res);
if (err){
console.log("error");
throw new Error(err.message);
}
else{
console.log("return true");
return true;
}
});
};
var waitForResult = Meteor.wrapAsync(asyncfnc);
var result = waitForResult(data_url,userid);
return result;
}
HTTP-Call工作,我也进入了HTTP.post函数的回调。 但是在我称之为流星方法的客户端上,我没有进入我的回调函数。它看起来像这样:
Meteor.call("uploadUserImage",data_url,Session.get("newUserID"),function (err, res) {
if(err){
console.log(err);
} else {
console.log('response: ', res);
}
});
我做错了什么?为什么我的流星方法没有返回任何东西? 我的Meteor.wrapAsync()一切都正确吗?
感谢您的帮助!
答案 0 :(得分:2)
我找到了一个解决方案,它不需要Meteor.wrapAsync()。
var url = "http://localhost:2000/upload";
//synchronous GET
var result = Meteor.http.post(url,{
data: {
"title": "i want to upload a picture",
"data_url": data_url,
"user_id": userid
},timeout:30000});
if(result.statusCode==200) {
console.log(result);
console.log("response received.");
return result;
} else {
console.log("Response issue: ", result.statusCode);
var errorJson = JSON.parse(result.content);
throw new Meteor.Error(result.statusCode, errorJson.error);
}
这使得HTTP-Post-Call同步,因此不需要包装异步。
答案 1 :(得分:0)
在这种情况下你问得太多了。 可以同步调用流星方法,但如果方法正在进行这样的远程调用,则不建议这样做。
我的感觉是,您正在依赖于程序编程模型,您希望获得同步结果1)对服务器的调用,以及2)发送到另一个远程服务器的请求。而且您希望从通话中获得返回值。它不会那样工作。
Meteor在很大程度上保护你免受异步性的影响,但有时你必须接受需要做更多的工作才能正确处理它。
所以我的建议是使用回调进行通知。