2013-07-13 68 views
1

例如,在處理來自數據庫的數據並將它們寫入某個數組的複雜循環之後,我需要處理數組中的數據。會發生什麼情況是數組處理的功能在不等待挖掘循環(填充數組)的情況下被觸發。一切都必須通過setTimeout()完成; 這是正常的嗎?沒有階段性的工作。這是正常的嗎?

checkDialog: function (data, callback) { 
    var interlocutorsArray = JSON.parse(data); 
    var dialogsId = {}; 
    mongoclient.open(function (err, cursor) { 

     var db = cursor.db('messages'); 
     var dialogsDb = db.collection('dialog'); 
     interlocutorsArray.forEach(function (item, index) { 
      dialogsDb.find({ 
       owner: item.owner_user_id, 
       viewer: item.viewer_user_id 
      }, function (err, cursor) { 
       cursor.count(function (err, count) { 
        if (count === 0) { 
         dialogsDb.insert({ 
          owner: item.owner_user_id, 
          viewer: item.viewer_user_id 
         }, function (err, inserting) { 
          dialogsId[inserting[0]._id] = { 
           owner: item.owner_user_id, 
           viewer: item.viewer_user_id 
          }; 
         }); 
        } else { 
         cursor.each(function (err, item) { 
          if (item !== null) { 
           dialogsId[item._id] = { 
            owner: item.owner, 
            viewer: item.viewer 
           }; 
          } 
         }); 
        } 
       }); 
      }); 
     }); 
    }); 

    setTimeout((function() { 
     callback(dialogsId); 
    }), 150); 

    console.log('after callback'); 

} 

對不起,我的英語不好!

+4

你在回調地獄那裏。 – alex

+0

@alex太糟糕了:( 但是,我該怎麼做? – RomanGorbatko

+0

我不明白是什麼問題?...對不起... – gillyb

回答

2

首先,我建議您切換從當前mongodb模塊的東西更舒適,如:

我會在我的例子中使用monk,通過它可以很容易地適用於任何mongodb月包括native mongodb node driver

至於你的問題,你可以與異步控制流程管理的任何模塊解決這個問題,比如:

下面是與async.js解決您的問題的一個例子:

checkDialog: function (data, callback) { 
    var db = require('monk')('localhost/messages'); 
    var dialogsDb = db.get('dialog'); 
    var interlocutorsArray = JSON.parse(data); 

    async.concat(interlocutorsArray, function (item, next) { 
    var query = { 
     owner: item.owner_user_id 
     viewer: item.viewer_user_id 
    }; 
    dialogsDb.find(query, function (err, docs) { 
     if (err) return next(err); 
     if (docs && docs.length > 0) { 
     next(null, docs); 
     } else { 
     dialogsDb.insert(query, function (err, inserting) { 
      next(err, [inserting]); 
     }) 
     } 
    }) 
    }, function (err, items) { 
    if (err) throw err; // it's best to handle errors without throwing them 
    var dialogsId = {}; 
    for (var item, i = 0; i < items.length; i++) { 
     item = items[i]; 
     dialogsId[item._id] = { 
     owner: item.owner, 
     viewer: item.viewer 
     }; 
    } 
    callback(dialogsId); 
    }) 
} 
+0

你的答案是完美的!你對解決我的問題非常有幫助!但是,我不太看重你的代碼。我想分解所有東西。 Немоглибывысомнойсвязаться:romangorbatko(at)gmail.com。非常感謝您的幫助! – RomanGorbatko