嵌套回调时为空数组

时间:2011-04-17 06:12:27

标签: javascript node.js couchdb

我循环遍历从couchdb返回的JSON数据数组,并将数据添加到数组然后返回数组,该数组应包含来自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 个答案:

答案 0 :(得分:2)

最初将返回

[] ,但一旦回调执行,数组将包含必要的数据。这是节点回调的本质 - 它们是异步的。

答案 1 :(得分:0)

要添加到davin所说的内容,您通常会使用回调来处理异步操作。您的代码存在的问题是,如果您有 n 不同的相册,那么 n 会发生同时的不同请求操作但您无法知道当他们全部完成时。

我不是Node.js家伙,所以也许有实用程序来处理这个问题,但是使用vanilla 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);
                }
            });
        });
    });
};