我一直试图让这个功能同步。我已经阅读了几篇关于Async的Stack Overflow帖子,但是我无法理解我如何才能使这种同步。截至目前,它是异步的,因此它在进入回调函数之前返回undefined。
我从客户端打电话:
Meteor.call('screenName',function(error,result) {
if (error) {
console.log(error);
}
else {
window.alert(result);
}
}
这是服务器端方法:
Meteor.methods({
'screenName': function() {
T.get('search/tweets',
{
q:'#UCLA',
count:1
},
function(err,data,response) {
var temp = data.statuses[0].user.screen_name;
console.log(temp);
return temp;
}
)
}
});
我正在使用Twitter API,我想要做的基本上是从JSON中检索屏幕名称并将其返回到客户端的变量。但是这是返回undefined,因为回调是在编译器到达' screenName'之后编译的。功能
我希望它从回调函数返回值,但是阅读其他示例并没有帮助我理解如何转换代码。我需要让这个功能同步,但我不知道该怎么做。
答案 0 :(得分:7)
只需使用Meteor.wrapAsync
将异步T.get
转换为同步风格的版本!
它实际上并没有被纯粹的"同步"但是,它使用的是一种称为光纤的技巧,但您应该阅读文档以了解更多信息 这是:
var Tget = Meteor.wrapAsync(T.get);
Meteor.methods({
'screenName': function() {
return Tget({
q : '#UCLA',
count : 1
}).status[0].user.screen_name;
}
});
答案 1 :(得分:6)
浏览器到服务器,无法同步调用方法。你坚持使用回调式代码。只能在服务器上进行同步调用。
http://docs.meteor.com/#/basic/Meteor-call
在客户端
调用客户端的方法是异步运行的,因此需要传递回调以观察调用的结果。将使用两个参数(错误和结果)调用回调。除非抛出异常,否则error参数将为null。抛出异常时,error参数是Meteor.Error实例,结果参数未定义。
在服务器上
在服务器上,您不必传递回调 - 方法调用将直接阻塞,直到方法完成,返回结果或抛出异常,就像您直接调用函数一样。
但是,服务器的同步样式代码取决于其他所有内容是否同步。如果可以同步编写Twitter API调用,您可能需要阅读API文档。否则,您最终将编写异步代码。
答案 2 :(得分:0)
@thatgibbyguy答案是唯一对我有用的答案。我也尝试过以下库(也许它们对某些人有用):
meteor add simple:reactive-method
meteor add mnmtanish:call
答案 3 :(得分:0)
我使用Promisse,是对async / await的很好回应。
示例:
// On Client
Template.nameTemplate.onCreated(async function(){
const callFunctionTest = await getScoreByCountry({ name: 'Testando' });
console.log(callFunctionTest);
});
async function getScoreByCountry(filter) {
return await new Promise((resolve, reject) => {
Meteor.call('app-method-test', filter , (error, resp) => {
if(error) {
reject(error)
} else {
resolve(resp)
}
})
})
}
// On server
Meteor.methods({
'app-method-test': test
});
function test(filter = {}) {
return App.Collections.NameCollection.findOne(filter)
}
答案 4 :(得分:-1)
这不是同步代码,但是我将使用服务器方法的结果发送回客户端函数所做的工作serversession来执行此操作。例如:
Meteor.methods({
'screenName': function() {
T.get('search/tweets',
{
q:'#UCLA',
count:1
},
function(err,data,response) {
var temp = data.statuses[0].user.screen_name;
ServerSession.set('screenname',temp)
return temp;
}
)
}
});
您现在可以将reactiveVariable,会话或模板助手设置为:
ServerSession.get('screenname')