2015-02-11 39 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

相關問題