2015-02-08 2 views
1

У меня есть приложение Node, которое я пишу там, где мне нужно использовать обещания для асинхронных вызовов.Node.js обещает использовать Q

У меня в настоящее время есть петля foreach, вызываемая из функции .then (function()), но когда я возвращаю конечный результат 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

+0

В: Используете ли вы флаг «--harmony» при вызове Node.js? Q: У вас есть какие-либо обработчики ошибок (или вообще какие-либо проверки ошибок)? – FoggyDay

+0

Где находится 'this.getData'? –

ответ

-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)); 
    }); 
} 
Смежные вопросы