4

Node.jsの非同期関数を使用して、オブジェクトの配列を反復処理し、これらのオブジェクト内にいくつかのものを追加しようとしています。

これまでのところ、私のコードは次のようになります。

var channel = channels.related('channels');
channel.forEach(function (entry) {

    knex('albums')
        .select(knex.raw('count(id) as album_count'))
        .where('channel_id', entry.id)
        .then(function (terms) {
            var count = terms[0].album_count;
            entry.attributes["totalAlbums"] = count;
        });

});
//console.log("I want this to be printed once the foreach is finished");
//res.json({error: false, status: 200, data: channel});

JavaScriptでそのようなことをどのように達成できますか?

4

2 に答える 2

7

すでに promise を使用しているため、その比喩を と混同しない方がよいでしょうasync。代わりに、すべての promise が終了するのを待ちます。

Promise.all(channel.map(getData))
    .then(function() { console.log("Done"); });

どこにgetDataある:

function getData(entry) {
    return knex('albums')
        .select(knex.raw('count(id) as album_count'))
        .where('channel_id', entry.id)
        .then(function (terms) {
            var count = terms[0].album_count;
            entry.attributes["totalAlbums"] = count;
        })
    ;
}
于 2015-03-21T04:31:21.777 に答える
1

async.eachを使用する

async.each(channel, function(entry, next) {
    knex('albums')
         .select(knex.raw('count(id) as album_count'))
         .where('channel_id', entry.id)
         .then(function (terms) {
            var count = terms[0].album_count;
            entry.attributes["totalAlbums"] = count;
            next();
         });
}, function(err) {
    console.log("I want this to be printed once the foreach is finished");
    res.json({error: false, status: 200, data: channel});
});

すべてのエントリが処理されると、最後のコールバックが呼び出されます。

于 2015-03-21T03:28:48.087 に答える