Meteor:使用不同的参数多次调用外部API并发布数据

时间:2016-02-11 08:59:18

标签: javascript meteor

我有一个要求,我需要多次调用相同的外部API但每次都使用不同的参数,每个调用结果应该以表格形式显示在UI中,所有这些结果都应该插入到db中。

在UI中没有延迟的最佳方法是什么?

这就是我现在正在尝试的

服务器代码:

Meteor.startup(function () {
    Meteor.methods({
      getLocation: function(){
          this.unblock();
          var userAddress = [1,2,3,4,5,6,7];
          for(var i=0;i<userAddress;i++){
            var response = HTTP.call("GET","URL"+userMacAddress[i]+"/track");
            if(response){
              result = response.data;
              var dateTime = new Date();
              DeviceView.insert({
                  'dateTime' : dateTime,
                  'aps' : result.aps|| '',
                  'Mac' : result.Mac
              });
              //keep pushing the repsone to array
            }
          }
        }
        //return the array
})
});

1 个答案:

答案 0 :(得分:0)

首先,无需将Meteor.methods()块放在Meteor.startup()内。

我不确定什么类型的&#34;延迟&#34;你试图阻止。鉴于您正在使用HTTP.call的同步版本,我将假设这是一种服务器端方法。

如果结果将显示在页面上,您只需在{{#each}}{{/each}}中使用template块,一旦插入结果,结果就会自动填充在页面上不需要从方法中返回数组,以便在UI中显示每个文档。

例如,假设您要在无序列表中显示结果,在模板文件中执行以下操作:

<template name="myTemplate">
    ...
    <ul>
    {{#each devices}}
    {{> device}}
    {{/each}}
    </ul>
    ...
    </template>

这会将每个项目的上下文传递给子模板&#34; device&#34;,这样您就可以创建一个名为&#34; device&#34;的模板:

<template name="device">
<li> The Mac Address is: {{Mac}} {{#if aps}} The APS is: {{aps}} Recorded at: {{dateTime}}</li>
</template>

在你的JS中你需要

Template.myTemplate.helpers({
    devices: function() {
       return DeviceView.find({});
    }
});

每当insert被触发时,该记录的<li>元素将自动插入DOM。

请记住,结果只能在每个HTTP.get请求返回时尽快返回。任何一个调用中的任何延迟都会导致在该结果(和下一个)出现之前出现延迟。

如果您不介意使用&#34;加载结果&#34;有一个preloader的东西你可以在容器上使用css display:noneopacity:0 然后在方法回调中使用一个函数来隐藏预加载消息,并在结果返回后显示结果。