пустой массив при вложении обратных вызовов - PullRequest
0 голосов
/ 17 апреля 2011

Я зацикливаюсь на массиве данных JSON, возвращаемых из couchdb, и добавляю данные в массив, а затем возвращаю массив. Массив должен содержать строки из couchdb, но возвращается [].

var Album = {
  all: function() {
    var data, albums = [];
    request({ uri: 'http://127.0.0.1:5984/albums/_all_docs'}, function(error, response, body) {
        if (error) throw error;
        data = JSON.parse(body);
        data.rows.forEach(function(d) {
            request({ uri: 'http://127.0.0.1:5984/albums/' + d.id }, function(error, response, body) {
                if (error) throw error;
                albums.push(JSON.parse(body));  
            });
        });
    });
    return albums;
  }
};

Ответы [ 2 ]

2 голосов
/ 17 апреля 2011

[] будет возвращено изначально, хотя после выполнения обратного вызова массив будет содержать необходимые данные. Такова природа обратных вызовов узла - они асинхронные.

0 голосов
/ 17 апреля 2011

Чтобы добавить то, что сказал Дэвин, вы обычно выполняете асинхронные операции с обратными вызовами.Проблема с вашим кодом заключается в том, что если у вас n разных альбомов, у вас есть n различных операций запроса, выполняемых одновременно , но у вас нет возможности узнать, когда они все финиш.

Я не парень Node.js, так что, возможно, есть утилиты, чтобы справиться с этим, но с ванильным JavaScript, вот как я бы справился с такой вещью с минимальными изменениями вваш код.

Вот несколько псевдо-javascript для краткости

Album.all = function(callback){
    request( "_all_docs", function(albums){
        var albumsLeft = albums.length;
        var results = [];
        albums.forEach( function(album_id){
            request( "albums/" + album_id, function(album){
                results.push(album);
                albumsLeft -= 1;                
                if( albumsLeft === 0){
                    callback(results);
                }
            });
        });
    });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...