2015-02-11 40 views
2
定义

有人可以在我的代码明白为什么变量oauthToken定义在服务器上,但没有定义时Meteor.callMeteor.call返回“不确定”结果当变量是在服务器

的结果返回给客户端

我打个电话来启动服务器

身体被解析的POST请求,我存储值到变量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); 
      } 
    }); 
} 
}); 

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? 
      } 
     }); 
    } 
}); 
+0

仅在服务器上定义的方法?如果我没有弄错,它必须在客户端和服务器上定义 – Suppen 2015-02-11 20:18:25

+0

只有在需要延迟补偿的情况下,上述情况才是真的 – Suppen 2015-02-11 20:20:42

+1

服务器请求是异步的,因此该方法实际上是立即返回。这看起来像[这个问题]的副本(http://stackoverflow.com/questions/23876325/meteor-how-to-return-data-from-the-server-using-meteor-call?rq=1)。 – mark 2015-02-11 20:34:23

回答

5

利用期货从异步函数返回值:

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() 
    } 
    }); 
+0

我以前从未使用过期货,但内部回调中的每条路径都不需要执行f.return()?我的意思是,未来正在等待发生...... – Suppen 2015-02-11 21:15:02

+0

@Christain - 我在版本2.3.1中添加了'future',并在您写下'var future = Npm.require(“fibers/future “)'...并且这起作用。 oauthToken被传回客户端并在结果中定义!谢谢 – meteorBuzz 2015-02-11 23:01:09

+0

@Suppen是的,这是正确的。 – 2015-02-12 10:44:13

0

那是因为你已经开始在方法体中的异步请求。该方法立即返回,并且来自请求的回调没有真正的返回结果。

我真的不知道如何用方法做到这一点,但你可以用发布/订阅来做到这一点。事情是这样的:

Server.js

var result = ""; 

Meteor.setInterval(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; 
       result = oauthtoken; 
      } 
     }); 
    }); 
}, 10*1000); 

Meteor.publish("goodReads", function() { 
    this.added("goodReads", 1, {reads: result}); 
    Meteor.setInterval(function() { 
     this.changed("goodReads", 1, {reads: result}); 
    }, 10*1000); 
    this.ready(); 
}); 

Client.js

goodReads = new Meteor.Collection("goodReads"); 
Meteor.subscribe("goodReads"); // May be done in waitOn in the router 

这被带到了我的头顶,并没有进行测试。它可能会或可能无法正常工作,但至少是一个指针,你如何能做到这一点

+0

我会试一试Suppen – meteorBuzz 2015-02-11 21:02:08

相关问题