Javascript 使流星法同步

Javascript 使流星法同步,javascript,asynchronous,meteor,Javascript,Asynchronous,Meteor,我一直在尝试使这个函数同步。我已经读过几篇关于异步的堆栈溢出文章,但我无法理解如何实现同步。到目前为止,它是异步的,因此在进入回调函数之前返回undefined 我从客户端称之为: Meteor.call('screenName',function(error,result) { if (error) { console.log(error); } else { window.alert(result);

我一直在尝试使这个函数同步。我已经读过几篇关于异步的堆栈溢出文章,但我无法理解如何实现同步。到目前为止,它是异步的,因此在进入回调函数之前返回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;
      }
    )
  }
});
我正在使用TwitterAPI,我想做的基本上是从JSON中检索屏幕名称,并将其返回到客户端的变量。但这返回未定义,因为回调是在编译器到达'screenName'函数末尾后编译的

我希望它从回调函数返回值,但阅读其他示例并不能帮助我理解如何转换代码。我需要使此函数同步,但我不知道如何执行。

从浏览器到服务器,无法同步调用方法。你被回调风格的代码卡住了。同步调用只能在服务器上进行

论客户 在客户端上调用的方法是异步运行的,因此需要传递回调以观察调用的结果。调用回调时将使用两个参数error和result。除非引发异常,否则错误参数将为null。抛出异常时,错误参数是Meteor.error实例,结果参数未定义

在服务器上 在服务器上,您不必传递回调—方法调用只需阻塞直到方法完成,返回结果或引发异常,就像您直接调用函数一样


但是,服务器的同步样式代码取决于其他内容是否同步。如果可以同步编写twitterapi调用,您可能需要阅读API文档。否则,您最终将编写异步代码。

这不是同步代码,但我所做的将服务器方法的结果发送回客户端函数的工作就是用来完成这项工作的。例如:

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;
      }
    )
  }
});
现在可以将反应变量、会话或模板帮助器设置为:

ServerSession.get('screenname')
只需使用即可将异步
T.get
转换为同步样式

虽然它实际上不会以纯粹的“同步”方式执行,它使用的是一种称为光纤的技巧,但您应该阅读文档以了解更多信息。
下面是:

var Tget = Meteor.wrapAsync(T.get);

Meteor.methods({
  'screenName': function() {
    return Tget({
      q : '#UCLA',
      count : 1
    }).status[0].user.screen_name;
  }
});

@这是唯一对我有用的答案。我还尝试了以下库(也许它们对某些人有用):


我使用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)
}

因为我使用的twitter包是Node模块,Node异步运行,所以async有助于它同步运行……下面是链接:也许我只是理解错了。请随意纠正我。。。。等等,你转发了吗?天哪,我没意识到我问了同样的问题。很抱歉嗯,我该如何结束这个问题?所以我没有被禁止或者其他什么,哈哈…,呃。。。我认为最好的办法是标记为复制。但是现在您有了两个相同的工作解决方案,一个来自我,一个来自@DavidWeldon。事实上,我认为OP只询问服务器端(参见他的代码),而不是客户端…@BjornTipling-yep,这就是为什么他应该查阅他们的文档:)此外,如果他提供了客户端代码,则标题有点含糊不清。Meteor方法调用不能同步。Meteor提供了内置程序来管理此类问题。查看我的答案。虽然我选择了这个作为正确答案,但它仍然不起作用。我开始收到另一个错误,因此,我问了另一个有助于解决最初问题的问题。以下是链接:
// 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)
}