我必须调用2个外部api,第2个与第一个结果相互依赖,我不确定是否更好地将其称为同步方式或异步方式。我也将数据转储到db,请注意,此函数在服务器中调用并独立于客户端运行。此方法定期运行。以下是我的代码。任何人都可以建议我以更好的方式做到这一点吗?
getUser: function(){
console.log('getMultipleDeviceLocation');
this.unblock();
var arrayOfResponse = [];
try{
var userData = HTTP.call("GET", "url");
if(userData && !userData.error){
var userResult = userData.data;
var userDateTime = new Date();
for(key in result){
NetworkUsers.insert({
'dateTime': userDateTime,
'userid': userResult[key].userid,
'userName': userResult[key].userName
});
try{
var response = HTTP.call("GET","url"+result[key].userid);
if(response){
var result = response.data;
var dateTime = new Date();
DeviceView.insert({
'dateTime' : dateTime,
'nearAPs' : result.nearByAPs || '',
'userid' : result.userid,
'userName': result.userName
});
}
}catch(error){
console.log(error);
}
}
}else{
console.log('error');
}
}catch(error){
//Main Try Catch Block
console.log(error);
}
}
我想要的是一旦第一次调用完成并且它返回一个响应,我希望将这些数据转储到数据库并使用相同的数据,我想再进行一次调用。异步会在这里造成问题吗?我必须让它同步吗?
答案 0 :(得分:0)
好吧,你实际上正在进行同步HTTP调用,这通常可以顺利运行。
我希望您只是将"url"
字符串写入第二个参数,因为您不想显示您在ST上调用的内容。如果没有,你可能会误解一些东西,你必须在这里写下api的url地址。
var userData = HTTP.call("GET", "url");
你让我笑到这一点;你不测试你在做什么吗?@Julien Leray你的意思是说,我写的内容会很好用吗?
我不知道你想要达到的API(就像我之前说的那样,我希望你只是隐藏它!)。我不知道它是否有效,但概念应该如此。你这里没有什么疯狂的,每次通话都是同步的,你不应该有任何麻烦。
现在,为了更进一步,你可以让它异步。如果你想测试非常甜蜜的Meteor功能,我建议你评论Meteor.WrapAsync
,但你也可以通过回调来制作香草。
例如Meteor.WrapAsync:
//dont want to show up my real Api Adress, using fake one
var url = "http://myApiUrl/foo/bar";
var options = {
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
}};
var getToSync = Meteor.wrapAsync(HTTP.get);
var data = getToSync(url, options);
//sweet, you can use data as if it was sync!
我对你的问题做了很好的回答,或者你错过了什么?