如何从节点中的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); }); };