2016-02-01 40 views
2

我试图实施以下方案: 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呼叫的作品,我也进入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()?

感谢您的帮助!

+1

你有错误吗? – greedsin

回答

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同步,所以不需要换行异步。

+2

你的答案仍然是异步...不保证只与超时同步..如果你的方法有多个用户多次呼叫...你的超时将无用.. –

+0

你认为this.unblock()可以做到这一点? – ant45de

+1

你需要'Meteor.wrapAsync()'...'this.unblock()'只会阻止你的方法阻止其他方法或订阅当你的方法被调用...这与同步调用没有任何关系.. –

0

你在这种情况下要求太多。 流星方法可以同步调用,但不建议如果方法是这样做的远程调用。

我的感觉是,你挂在一个程序编程模型,你想要一个同步结果1)调用你的服务器,2)发送到另一个远程服务器的请求。你想从你的通话中获得回报价值。它不这样工作。

流星在很大程度上可以保护您免受异步性的影响,但有时您必须接受需要更多的工作才能正确处理它。

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