2017-01-24 7 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

非同期コードを同期しないでください。ただし、selectedPeopleList配列は印刷されません。実際には何もコンソールに出力されません。 – user7438390

+0

申し訳ありませんまだ 'docs'に間違った参照があります(' result'にする必要があります)。 –

+0

私もそれを試みましたが、まだ何も印刷していません。 console.logでもない( "私たちの結果"、結果); – user7438390