Meteor wrapAsync

时间:2016-02-01 13:45:07

标签: asynchronous meteor

我正在尝试实现以下方案: 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()一切都正确吗?

感谢您的帮助!

2 个答案:

答案 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在很大程度上保护你免受异步性的影响,但有时你必须接受需要做更多的工作才能正确处理它。

所以我的建议是使用回调进行通知。