2015-02-08 102 views
1

我有一个节点应用程序,我在写需要使用承诺异步调用。Node.js承诺使用Q

我目前有一个foreach循环从一个.then(函数())的promise中调用,但是当我返回foreach的最终结果时,我什么也得不到。

在foreach中,我可以console.log数据的值并检索它,但不在返回之前的for循环之外?

var Feeds = function(){ 
    this.reddit = new Reddit(); 
} 

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

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

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; 
} 

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; 

     data.push(post); 
    } 


    return data; 
} 
+0

我没有看到用Q的'.then'功能或'的任何地方forEach'在代码中? – laggingreflex 2015-02-09 00:08:45

+0

问:您在调用Node.js时是否使用了“--harmony”标志?问:你是否有任何错误处理程序(或任何类型的错误检查)? – FoggyDay 2015-02-09 00:09:47

+0

'this.getData'在哪里? – 2015-02-09 00:30:04

回答

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

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

,当我看到这一点,我看到承诺回调“返回” ......我不知道你为什么这样做,但我只是想确定:

我想要这个“返回”是函数'parseRedditData'的返回值,这是行不通的。

回到这里你的数据的唯一方法是用回调或承诺,像这样:

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

    this.getData(this.reddit.endpoint).then(function(data){ 
     callback(_this.reddit.parseData(data, q)); 
    }); 
}