Javascript 如何从节点中的api承诺返回对象
我试图理解承诺是如何起作用的,但显然我遗漏了一些东西 在node中,我有一个搜索函数,它使用Twit模块返回Twitter结果,然后我想对结果做一些处理:Javascript 如何从节点中的api承诺返回对象,javascript,node.js,twitter,promise,bluebird,Javascript,Node.js,Twitter,Promise,Bluebird,我试图理解承诺是如何起作用的,但显然我遗漏了一些东西 在node中,我有一个搜索函数,它使用Twit模块返回Twitter结果,然后我想对结果做一些处理: var twitter = require('../server/twit'); exports.getTwitSearchResult = function(query, cb) { var t = twitter.searchTwitter(query) // do something with variable 't'
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);
};
twitter函数位于“../server/twit”
:
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'总是返回为未定义的
或[对象承诺]
。我尝试了几种使用承诺和回调编写函数的不同方法,大致如下:
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:无法读取未定义的属性“then”
如何更好地编写它,以便使用从Twit promise返回的结果?由于函数是异步的,并且不返回任何内容,因此变量t始终是未定义的。您需要使用回调 对于“../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);
});
};
你试过在第一段代码中使用.then()吗?是的,这就是它未定义的地方