使Meteor方法同步

时间:2015-07-28 19:24:01

标签: javascript asynchronous meteor

我一直试图让这个功能同步。我已经阅读了几篇关于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'之后编译的。功能

我希望它从回调函数返回值,但是阅读其他示例并没有帮助我理解如何转换代码。我需要让这个功能同步,但我不知道该怎么做。

5 个答案:

答案 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')