2015-02-09 46 views
1

對Node.js使用Q,我承諾會有一個HTTP請求,並且在履行時調用另一個傳遞該HTTP請求的響應的函數,然後該函數將遍歷來自HTTP請求,建立一個新的數組,並返回它。Node.js Q promise for each return undefined

調試Reddit.prototype.parseData我可以看到HTTP JSON被傳入,並且在for語句中,我可以在console.log data中創建它,但是在foreach的最後我無法通過console.log或返回數據對象,它返回undefined

Reddit.js

var Reddit = function(){ 
    this.endpoint = "https://www.reddit.com/r/programming/hot.json?limit=10"; 
} 

Reddit.prototype.parseData = function(json, q){ 
    var dataLength = json.data.children.length, 
     data  = []; 

    for(var i = 0; i <= dataLength; i++){ 
     var post = {}; 

     post.url = json.data.children[i].data.url; 
     post.title = json.data.children[i].data.title; 
     post.score = json.data.children[i].data.score; 

     console.log(data); //returns data  

     data.push(post); 
    } 

    console.log(data); // returns undefined 

    return data; 
} 

module.exports = Reddit; 

Feeds.js

var https = require('https'), 
     q  = require('q'), 
     Reddit = require('./sources/reddit'); 

var Feeds = function(){ 
    this.reddit = new Reddit(); 
    console.log(this.parseRedditData()); //undefined 
} 

Feeds.prototype.getData = function(endpoint){ 
    var deferred = q.defer(); 

    https.get(endpoint, function(res) { 
     var body = ''; 

     res.on('data', function(chunk) { 
      body += chunk; 
     }); 

     res.on('end', function() { 
      deferred.resolve(JSON.parse(body)); 
     }); 
    }).on('error', function(e) { 
     deferred.reject(e); 
    }); 

    return deferred.promise; 
} 

Feeds.prototype.parseRedditData = function(){ 
    var _this  = this; 

    this.getData(this.reddit.endpoint).then(function(data){ 
     return _this.reddit.parseData(data); 
    }); 


} 

var fe = new Feeds() 
+0

您的'parseRedditData'方法將始終未定義,因爲它不會返回任何內容。通過在解析getData承諾時記錄數據變量,您將看到您期望的結果(假設代碼中沒有其他錯誤)。 – soulprovidr 2015-02-09 21:09:33

+0

更新的代碼返回promise中的某些內容,getData promise上的'data'變量是http請求的結果? – 2015-02-09 21:11:41

+0

另一方面,您應該在'Reddit.prototype.parseData'中爲'(var i = 0; i <= dataLength; i ++)'中的'<'運算符' – vanchagreen 2015-02-09 21:16:12

回答

2

正如@sholanozie說,不必返回任何東西從parseRedditData。我猜你想要的是:

var Feeds = function(){ 
    this.reddit = new Reddit(); 
    this.parseRedditData().then(function(data) { 
     console.log(data); 
    }); 
}; 
... 
Feeds.prototype.parseRedditData = function(){ 
    var _this  = this; 

    return this.getData(this.reddit.endpoint).then(function(data){ 
     return _this.reddit.parseData(data); 
    }); 
} 
+0

錯誤發生在哪一行? – Ben 2015-02-09 21:18:54

+0

好吧,所以我現在看到了這個工作,但是,我仍然沒有從我的console.log上的Feeds.js的第9行返回任何內容,在Reddit.js中有什麼需要做的嗎? – 2015-02-09 21:20:09

+0

你指的是'Feed'構造函數的這個部分:'this.parseRedditData()。then(function(data){console.log(data);});'? – Ben 2015-02-09 21:24:39