2016-03-28 56 views
1

我想了解承諾如何工作,並顯然缺少的東西。如何從API中返回對象承諾在節點

在節點我有一個使用的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'總是以undefined[object Promise]的形式返回。我試圖用承諾和回調寫功能的幾種不同的方式,沿東西線這樣的:

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承諾返回的結果?

+0

您是否在第一段代碼中嘗試過使用.then()? –

+0

是的 - 這就是它未定義的地方 – alphaleonis

回答

1

您的變量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); 
    }); 

};