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

How to return object from api promise in node

本文关键字:api promise 返回 对象 节点      更新时间:2023-09-26

我试图理解promise是如何工作的,但显然缺少了一些东西。

在节点中,我有一个搜索功能,它使用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);
};

'../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]的形式返回。我已经尝试了几种使用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承诺返回的结果?

您的变量t将始终未定义,因为函数是异步的,不返回任何内容。您需要使用回调。

为了你的/服务器/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);
  });   
};

如果你想使用promise,你应该切换到使用模块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);
  });   
};