簡體   English   中英

需要節點for循環回調

[英]Node for-loop callback required

我想更改我從收藏夾之一中獲取的標簽格式。 標簽數據在數組中包含一些KC ID,我正在使用該數組獲取KC數據並插入TagUnit中以獲取最終響應格式。

var newTags = Tags.map(function(TagUnit) {
    for (var i = 0; i < TagUnit.kcs.length; i++) {
        KCArray = [];
        KC.findById(TagUnit.kcs[i], function(error, data) {
            KCMap = {};
            KCMap['kc_id'] = data._id;
            KCMap['kc_title'] = data.title;
            KCArray.push(KCMap);
            if (KCArray.length == TagUnit.kcs.length) {
                TagUnit.kcs = KCArray;
            }
        });
     }
     return TagUnit;
});

response.send(JSON.stringify(newTags));

但是我沒有得到期望的結果。 響應是以初始形式而不是格式化形式發出標簽數據。 我猜這是由於事件循環造成的。 如果有人可以幫助我,我將不勝感激。

**編輯:**我使用MongoDB作為數據庫,使用Mongoose作為ORM。

您可以使用Promise或Async模塊

var async = require('async');
...
function getKC (kc, callback) {
   KC.findById(kc, function(err, data) {
       if (err)
          return callback(err);

       callback(null, {kc_id: data._id, kc_title: data.title})
   });
}

function getKCs (tag, callback) {
   async.map(tag.kcs, getKC, callback);
}

async.map(Tags, getKCs, function(err, results){
    if (err)
       return console.log(err.message);

    res.json(results); // or modify and send
});

PS也許,代碼包含錯誤。 我無法測試。

我建議使用諾言來管理您的異步操作,這現在已成為ES6中的標准。 您沒有說您正在使用什么數據庫(它可能已經具有基於Promise的界面)。 如果不是,那么我們手動啟用KC.findById()

function findById(key) {
    return new Promise(function(resolve, reject) {
        KC.findById(key, function(err, data) {
            if (err) return reject(err);
            resolve(data);
        });
    });
}

然后,假設您可以並行執行所有這些查找操作,則可以使用Promise.all()跟蹤完成的時間並為您排序。

var allPromises = Tags.map(function(TagUnit) {
    var promises = TagUnit.kcs.map(function(key) {
        return findById(key).then(function(data) {
            // make resolved value be this object
            return {kc_id: data._id, kc_title: data.title};
        });
    });
    // this returns a promise that resolves with an array of the kc_id and kc_title objects
    return Promise.all(promises).then(function(results) {
        return {
             _id: TagUnit._id,
             kcs: results
        };
    });
});

// now see when they are all done
Promise.all(allPromises).then(function(results) {
    response.send(JSON.stringify(results));
}).catch(function(err) {
    // send error response here
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM