我有一个要求,我需要多次调用相同的外部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
})
});
答案 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:none
或opacity:0
然后在方法回调中使用一个函数来隐藏预加载消息,并在结果返回后显示结果。