Meteor:从服务器调用相互依赖的外部API并将数据转储到db

时间:2016-02-16 11:15:27

标签: javascript meteor

我必须调用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);
        }
      }

我想要的是一旦第一次调用完成并且它返回一个响应,我希望将这些数据转储到数据库并使用相同的数据,我想再进行一次调用。异步会在这里造成问题吗?我必须让它同步吗?

1 个答案:

答案 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!

我对你的问题做了很好的回答,或者你错过了什么?