如何从节点中的api promise返回对象

我试图理解承诺是如何工作的,而且显然错过了一些东西。

在节点中,我有一个使用Twit模块返回Twitter结果的search函数,然后我想用结果做一些事情:

var twitter = require('../server/twit'); exports.getTwitSearchResult = function(query, cb) { var t = twitter.searchTwitter(query) // do something with variable 't' // var tweet = t.data.statuses // ... // ... cb(null, tweet); }; 

'../server/twit' twitter函数:

 var Twit = require('twit') var bot = new Twit(config); exports.searchTwitter = function(query){ var tsearch = function(query, callback){ return bot.get('search/tweets', { q: query , since: '2016-02-01' , result_type: 'popular' , count: 1 }, function(err, data, response){ callback(data) }); }; tsearch(query, function(callback){ return callback }) }; 

问题是't'总是返回undefined或者[object Promise] 。 我已经尝试了几种不同的使用承诺和callback函数编写函数的方法,如下所示:

 var twitter = require('../server/twit'); exports.getTwitSearchResult = function(query, cb) { var t = function(query, callback){ return twitter.searchTwitter(query) .then(function(tweet){ callback(tweet) }) } // do something with variable 't' // var tweet = t.data.statuses // ... // ... cb(null, tweet); }; 

但后来我得到TypeError: Cannot read property 'then' of undefined

我怎样才能更好地写出这样的结果,以便我可以使用Twit承诺的结果?

你的variablest将永远是未定义的,因为函数是asynchronous的,不会返回任何东西。 您需要使用callback。

对于你的“../server/twit”文件:

 var Twit = require('twit') var bot = new Twit(config); exports.searchTwitter = function(query, callback){ bot.get('search/tweets', { q: query , since: '2016-02-01' , result_type: 'popular' , count: 1 }, callback); }; 

主文件:

 var twitter = require('../server/twit'); exports.getTwitSearchResult = function(query, cb) { twitter.searchTwitter(query, function(err, data, response) { // do something with variable 'data' // var tweet = data.statuses // ... // ... cb(null, tweet); }); }; 

如果你想使用承诺,你应该切换到使用模块twit-promise并将您的代码更改为:

 var Twit = require('twit-promise') var bot = new Twit(config) exports.searchTwitter = function(query){ return bot.get('search/tweets', { q: query , since: '2016-02-01' , result_type: 'popular' , count: 1 }); }; var twitter = require('../server/twit'); exports.getTwitSearchResult = function(query, cb) { twitter.searchTwitter(query) .then(function(result) { // do something with variable 'result' // var tweet = result.data.statuses // ... // ... cb(null, tweet); }) .catch(function(err) { cb(err); }); };