当在服务器上定义变量时,Meteor.call返回'undefined'结果

met*_*uzz 2 methods post asynchronous node.js meteor

有人可以在我的代码中看到为什么变量oauthToken在服务器上定义但在Meteor.call的结果中返回到客户端时未定义

我打电话在服务器上发起一个帖子请求

解析了正文,并将值存储到变量oauthToken中

这打印在服务器上,但不会在我的'结果'中打印出客户端

这是因为客户端正在运行模拟吗?我们可以在异步函数中执行"返回"吗?

Server.js

Meteor.methods({
 getGoodreads: function () { 
 request.post('http://www.goodreads.com/oauth/request_token', {oauth:{
                 consumer_key: '89hdg8pEoMzRdg',
                 consumer_secret: 'dfgdfgHthtdtjtt' }}, function (error, response, body) {
      if (!error && response.statusCode == 200) {
              var a = querystring.parse(body)
              oauthToken = a.oauth_token
              console.log(oauthToken); //prints value i need
              return oauthToken
       }else{
              console.log('there is an error ' + error);
            }
   });
} 
});
Run Code Online (Sandbox Code Playgroud)

client.js

Template.profile.events({
    'click #goodreads': function (event) {
        event.preventDefault();
        Meteor.call('getGoodreads', function(error, result) {
            if (error) {
                console.log('this is an error ');
            } else {
                console.log(result); //THIS IS UNDEFINED...possibilities?
            }
        });
    }
 });
Run Code Online (Sandbox Code Playgroud)

Chr*_*rra 5

使用future从异步函数返回值:

var Future = Npm.require("fibers/future")    
Meteor.methods({
     getGoodreads: function () { 
     var f = new Future();
     request.post('http://www.goodreads.com/oauth/request_token', {oauth:{
                     consumer_key: '89hdg8pEoMzRdg',
                     consumer_secret: 'dfgdfgHthtdtjtt' }}, function (error, response, body) {
          if (!error && response.statusCode == 200) {
                  var a = querystring.parse(body)
                  oauthToken = a.oauth_token
                  console.log(oauthToken); //prints value i need
                  return f.return(oauthToken)
           }else{
                  f.throw(error);
                  console.log('there is an error ' + error);
                }
       });
       return f.wait()
    } 
    });
Run Code Online (Sandbox Code Playgroud)