2017-01-24 5 views
0

Я пытаюсь использовать обещания, чтобы выполнить назначение людей на смену, найдя человека, который работал в течение наименьшего количества времени. Для этого я использую агрегат для привязки документа доступности каждого человека к своему документу записи, который содержит последний раз, когда они работали. Кажется, что он пропускает весь раздел кода, который связан с обещаниями, потому что он печатает selectedPeopleList как пустой массив. Вот мой код:Выполнение обещаний последовательно в javascript

var selectedPeopleList = []; 

var sequentially = function(shifts) { 

var p = Promise.resolve(); 

shifts.forEach(function(){ 
    p=p.then(function() { return collection.aggregate([ 
     { 
      $lookup: 
      { 
       from: "personRecord", 
       localField: "ATTU_ID", 
       foreignField: "ATTU_ID", 
       as: "record" 
      } 
     }, 

     { 
      $match : { 'Available[]' : { $elemMatch : { $eq : shift.value } }, "record.ATTU_ID": { $nin : _.map(selectedPeopleList, 'ATTU_ID') } } 
     }, 

     { 
      $sort : { "record.lastShift" : 1 } 
     } 
      ]).toArray(function(err, docs){ 
      assert.equal(err, null); 

      }).then(function (result) { 
      if(docs && docs.length) { 
       selectedPeopleList.push({ ATTU_ID : docs[0].ATTU_ID, Name: docs[0].Name }); 
       console.log(docs[0]); 
      } 
      }); 
     });    
    }) 
    return p; 
}; 
console.log(selectedPeopleList); 
+1

Обещание не делает асинхронный код синхронным –

ответ

2

Обещания не делают асинхронный код синхронной

изменения, последняя линия

p.then(function() { 
    console.log(selectedPeopleList); 
}); 

также, вам не нужно ничего возвращать в Foreach, а возвращаемое значение вообще не используется

0

В коде есть немало мелких ошибок.

Убедитесь, что вы правильно следите за своим потоком асинхронного кода. Я попытался решить все проблемы в своем фрагменте.

var selectedPeopleList = []; 
 

 
var sequentially = function(shifts) { 
 

 
var p = Promise.resolve(); 
 
//use promise all to merge all promises in to 1. and use map to return the promises. 
 
Promise.all(shifts.map(function(){ 
 
    p=p.then(function() { return collection.aggregate([ 
 
     { 
 
      $lookup: 
 
      { 
 
       from: "personRecord", 
 
       localField: "ATTU_ID", 
 
       foreignField: "ATTU_ID", 
 
       as: "record" 
 
      } 
 
     }, 
 

 
     { 
 
      $match : { 'Available[]' : { $elemMatch : { $eq : shift.value } }, "record.ATTU_ID": { $nin : _.map(selectedPeopleList, 'ATTU_ID') } } 
 
     }, 
 

 
     { 
 
      $sort : { "record.lastShift" : 1 } 
 
     } 
 
      ]).toArray(function(err, docs){ 
 
      assert.equal(err, null); 
 
      }) 
 
    })//make sure you finish then! before you start a new one. 
 
    
 
    .then(function (result) { 
 
      console.log('our results', result); 
 
      if(result && result.length) { //use result variable! 
 
       selectedPeopleList.push({ ATTU_ID : result[0].ATTU_ID, Name: result[0].Name }); 
 
       
 
      } 
 
      
 
     });    
 
    }) 
 

 
    return p; 
 
}) 
 
) 
 
.then(function(){ //lets await all the promises first. and then read the list. 
 
    
 
    console.log(selectedPeopleList); 
 
    });

+0

Я сделал изменения вы предложили; однако теперь выбранный массивPeopleList не печатает. На самом деле ничего не печатает на консоли. – user7438390

+0

жаль, что у меня все еще были неправильные ссылки на 'docs' (должно быть' result') вы можете запустить и посмотреть, что он теперь возвращает? –

+0

Я тоже это пробовал и до сих пор ничего не печатаю. Даже не console.log («наши результаты», результат); – user7438390

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