我正在尝试实现以下场景: 1.客户端调用meteor-method。2.在meteor-method中,我向不同的服务器发送HTTP-Post。3.响应HTTP调用时,meteor方法应返回true,如果出现错误,则应返回false。
下面是我的meteor方法:
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调用起作用了,我也进入了HTTP.post函数的回调。但是在客户端,当我调用meteor方法时,我没有进入我的回调函数。它看起来是这样的:
Meteor.call("uploadUserImage",data_url,Session.get("newUserID"),function (err, res) {
if(err){
console.log(err);
} else {
console.log('response: ', res);
}
});我做错了什么?为什么我的meteor-method没有返回任何东西?我的Meteor.wrapAsync()是否一切正常?
谢谢你的帮忙!
发布于 2016-02-01 22:25:32
我找到了一个不需要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同步,因此不需要包装异步。
发布于 2016-09-25 06:03:54
在这种情况下,你的要求太高了。Meteor方法可以同步调用,但如果该方法像这样进行远程调用,则不可取。
我的感觉是,您使用的是过程化编程模型,您希望1)对服务器的调用和2)向另一个远程服务器发送请求的同步结果。并且您希望从调用中获得返回值。它不是那样工作的。
Meteor在很大程度上避免了处理异步,但有时您必须接受需要更多的工作才能正确地处理它。
所以我的建议是使用回调来通知。
https://stackoverflow.com/questions/35132093
复制相似问题