我有一个要求,我需要从外部API发布数据,然后将该数据也插入到MongoDB中。到目前为止,我已经实现的是从外部API获取数据并插入到数据库并发布相同的日期工作正常,但用户可以看到此实现中的延迟。
要求是在选择下拉列表中的值时调用外部API,并在templateName模板中发布相同的数据并将其插入到后台的数据库中。
如何发布来自外部API的数据并插入相同的数据?我在事件函数中使用Meteor.call和调用服务器方法。
<template name="category">
<select id="category">
<option disabled="disabled" selected="selected">Please Select</option>
{{#each categories}}
<option value="{{V}}">{{V}}</option>
{{/each}}
</select>
</template>
<template name="templateName">
{{a}}
{{b}}
</template>
Template.category.events({
"change #category": function (event, template) {
var cat = $(event.currentTarget).val();
Meteor.call('serverMethod',cat, function(err, response) {
Collections.insert(response.data);
BlazeLayout.render('MainContainer',{main: "templateName"} );
});
});
答案 0 :(得分:2)
请注意,调用外部API的人是server
。为什么要将响应从服务器发送到客户端,然后将响应从客户端插入到服务器到数据库?这就是你发现延迟的原因。
服务器获得响应后,将响应速度快得多,然后将响应插入数据库
这将插入对DB的响应:
Meteor.methods({
methodName: function () {
var response = HTTP.call(method, url, options, asyncCallback);
if (response) {
Collections.insert(response.data);
}
return response
}
});
对客户的回应:
Template.category.events({
"change #category": function (event, template) {
var cat = $(event.currentTarget).val();
Meteor.call('serverMethod',cat, function(err, response) {
Session.set('apiData', response.data)
BlazeLayout.render('MainContainer',{main: "templateName"} );
});
}
});
Template.templateName.helpers({
apiData: function () {
return Session.get('apiData')
}
});
您无需订阅。数据已通过方法调用在客户端,并通过Session.get()
传递给templateName。如果你使用subscribe,那么到达客户端会慢得多,而且效率低的双倍数据