2016-01-30 3 views
1

Я вроде если новый в Node JS (я использую MongoDB, Экспресс и Мангуст) и у меня есть следующая проблема:Node JS - Обработка несколько запросов (обещание, Блюбердо)

Там есть массив с 10 идентификаторов адресов, и мне нужно проверить, Все адреса находятся в базе данных, прежде чем делать что-то еще. Я знаю, мангуст делает асинхронные запросы, я пытался использовать Bluebird (https://www.npmjs.com/package/bluebird) давать обещания, но до сих пор не повезло:

Здесь пока некоторые atempts:

1-й

var checkIds = function(idsArray){ 
    return new Promise(function(resolve, reject){ 
     var result = undefined; 
     idsArray.forEach(function(id){ 
      Address.count({_id: id}, function(err, count){ 
       //count is 0 if id does not exist 
       if(err || !count){ 
        reject(false); 
       } 
      }); 
     resolve(true); 
     }); 
    } 
} 

2-й

var checkIds = function(idsArray){ 
    return new Promise(function(resolve, reject){ 
    var result = 0; 
    for(var i = 0; i < idsArray.lenght; i++){ 
     Address.count({_id: idsArray[i]}, function(err, count){ 

      if(err || !count){ 
       reject(false); 
      }else{ 
       result++; 
      } 

     }); 
    } 
    resolve(result == 10 ? true : false); 
    }); 
} 

Даже если массив содержит только идентификаторы возвращение обещания всегда неопределенных для является первой попыткой t или false для второго.

Может ли кто-нибудь мне помочь?

ответ

1

Что вы мог бы попробовать что-то вроде этого

model.find({ '_id': {$in: idsArray} }, function(err, docs) { 
    if(docs.length == 10) { 
     console.log("Your 10 docs with the 10 Ids are in your Database"); 
    } 
}) 

Вы даже можете использовать «счет «как это

model.count({ '_id': {$in: idsArray} }, function(err, count) { 
    if(count == 10) { 
     console.log("Your 10 docs with the 10 Ids are in your Database"); 
    } 
}) 
+0

Он работал очень хорошо, спасибо большое. – fernandodof

2

Там, вероятно, способы promisify MongoDB и делать запросы, что делает это проще, но вы также можете просто создать массив обещаний и использовать Promise.all

var checkIds = function(idsArray){ 
    var promises = []; 

    idsArray.forEach(function(id){ 
     var promise = new Promise(function(resolve, reject){ 

      Address.count({_id: id}, function(err, count){ 
       if(err or !count){ 
        reject(false); 
       } else { 
        resolve(true); 
       } 
      }); 
     }); 

     promises.push(promise); 
    } 
    return Promise.all(promises); 
} 

А потом сделать

checkIds(['id1', 'id2', 'id3']).then(function(values) { 
    // success 
}, function(reason) { 
    // fail 
}) 
+0

Спасибо adaneo, я попробую это. – fernandodof

+0

adaneo, он работал очень хорошо, спасибо. Тем не менее, ответ Тьерри был простым способом решить эту проблему. – fernandodof

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