2014-09-03 4 views
0

У меня есть массив документов с уникальным _id, и я хочу вставить их в свою базу данных. Некоторые из них уже находятся в db, и для тех, кому я хочу обновить свойство массива (нажмите массив в элементе). Все это мне нужно сделать asyncronuosly, поэтому после вставки/обновления я хочу написать ответ назад (с обратным вызовом) клиенту, чем все нормально, или написать ошибку. После поиска по теме я нашел это solution with async module Я попытался реализовать его для своего дела. Теперь мой код выглядит так:Создание butch upsert in mongodb: callback никогда не запускается

function processUsers(arr, listName, callback) { 

    var users = global.db.collection('vkusers'); 
    var q = async.queue(function(task, cb) { 
     console.log('upsert butch'); 
     users.insert(task.doc, function(err, doc) { 
      if (err) { 
       users.update({ 
        _id : task.doc._id 
       }, { 
        $addToSet : { 
         mLists : listName 
        } 
       }, function(error, result){ console.log(error); console.log(result); }); 
      } 

     }); 

    }, arr.length); 

    for (var doc in arr) { 
     q.push({ 
      doc : arr[doc] 
     }, function(err) { 
      if (err) 
       callback(err, null); 
     }) 
    } 
    q.drain = function() { 
     // this is the queue's callback, called when the queue is empty, 
     // i.e. when all your documents have been processed. 
     console.log('drain'); 
     callback(null, { result: "success", upserted: arr.length }); 
    } 

} 

Обратный звонок имеет обратный вызов (ошибка, результат), arr - мой массив документов. Я тестировал его, и с базой данных все в порядке, я получаю правильный результат. Но callback, и q.drain никогда не срабатывали!

ответ

0

Обратный звонок async.queue (cb в вашем коде), когда ваша вставка/обновление завершено. Что-то вроде этого:

var q = async.queue(function(task, cb) { 
    console.log('upsert butch'); 
    users.insert(task.doc, function(err, doc) { 
     if (err) { 
      users.update({ 
       _id : task.doc._id 
      }, { 
       $addToSet : { 
        mLists : listName 
       } 
      }, function(error, result) { 
       console.log(error); 
       console.log(result); 

       cb(error); // Update finished; call cb and pass in "error" so that it can bubble up if it exists 
      }); 
     } else { 
      cb(); // Insert succeeded; call cb 
     } 
    }); 

}, arr.length); 
+0

Большое спасибо, все работает нормально! –

Смежные вопросы