Javascript 如何从节点中的api承诺返回对象

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'

我试图理解承诺是如何起作用的,但显然我遗漏了一些东西

在node中,我有一个搜索函数,它使用Twit模块返回Twitter结果,然后我想对结果做一些处理:

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()吗?是的,这就是它未定义的地方