2017-10-12 13 views
0

私のノードJSバックエンドでこのメソッドを実行します。一番下のプリントでノードjsは各ループを同期させます

var locations = []; 

exports.constructionsiteParser = function constructionsiteParser(response){ 
    var timestamp = new Date().toDateInputValue(); 
    const $ = cheerio.load(response); 
    $('situation').each(function(){ 
    var situation = []; 
     $(this).find('situationRecord').each(function(i){ 
      var startLocationCode = $(this).find('alertCMethod2SecondaryPointLocation').find('specificLocation').text(); 
     var endLocationCode = $(this).find('alertCMethod2PrimaryPointLocation').find('specificLocation').text(); 
     var overallStartTime = $(this).find('overallStartTime').text(); 
     var overallEndTime = $(this).find('overallEndTime').text(); 
     if((startLocationCode != '') && new Date(timestamp) >= new Date(overallStartTime) && new Date(timestamp) <= new Date(overallEndTime)){ 
     Promise.all([ 
      locationCodeToGeodataRequst.geodataByLocationcode(startLocationCode), 
      locationCodeToGeodataRequst.geodataByLocationcode(endLocationCode) 
     ]).then(values =>{ 
      return createSituationRecord($, this, startLocationCode, endLocationCode, values[0], values[1]); 
     }).then(function(obj){ 
      console.log("before push", situation); 
      situation.push(obj); 
      console.log("after push", situation); 
      return situation; 
     }, handleError); 
     } 
    }) 
    console.log("from outter", situation.length); 
    if(situation.length > 0){ //if situation is not empty 
     locations.push(situation); 
    } 
    }) 
     console.log(locations); 
    } 

console.log("from outter", situation.length);常に0 もconsole.log(locations)が空

ですこれは、ログの一部です:

... 
from outter 0 
from outter 0 
from outter 0 
from outter 0 
from outter 0 
[] 
before push [] 
after push [.... 

私は、ノードサーバが実行されるため、この問題が発生したと思います内側の各ループが終了する前の底部。だから、私はそれをもっとうめきたいと思っています。私がしたいことは、次のようなものです:

outer each{ 

    //run this first 
    inner each{ 
    ..... 
    } 

    //if inner each is done run this 
    if(...){} 

} 

しかしこれを正しい構文にする方法はわかりません。 入れ子になった約束で試してみましたが、うまくいきません。

答えて

1

async.eachOf()を利用できます。あなたのコードを同期させるには別のアプローチをとった。それがあなたを助けることを願ってください。

'use strict'; 


let locations = []; 

exports.constructionsiteParser = function constructionsiteParser(response) { 
    const $ = cheerio.load(response); 

    $('situation').each(function() { 
    let situation = []; 

    async.eachOf($(this).find('situationRecord'), function (value, key, callback) { 
     innerLoop(callback); 
    }, function (err, situation) { 
     if (err) { 
     return console.error(err.message); 
     } 

     console.log("from outter", situation.length); 

     // this will run only if the inner loops completes 
     if (situation.length > 0) { //if situation is not empty 
     locations.push(situation); 
     } 
    }); 


    }); 
    console.log(locations); 
}; 

function innerLoop(callback) { 
    let startLocationCode = $(this).find('alertCMethod2SecondaryPointLocation').find('specificLocation').text(); 
    let endLocationCode = $(this).find('alertCMethod2PrimaryPointLocation').find('specificLocation').text(); 
    let overallStartTime = $(this).find('overallStartTime').text(); 
    let overallEndTime = $(this).find('overallEndTime').text(); 

    if (isInvalid(startLocationCode, overallStartTime, overallEndTime)) { 
    return callback('some error msg'); 
    } 

    Promise.all([ 
    locationCodeToGeodataRequst.geodataByLocationcode(startLocationCode), 
    locationCodeToGeodataRequst.geodataByLocationcode(endLocationCode) 
    ]).then(values => { 
    return createSituationRecord($, this, startLocationCode, endLocationCode, values[0], values[1]); 
    }).then((obj) => { 
    return callback(null, obj); 
    }).catch((err) => { 
    console.log('err', err.stack); 
    return callback(err); 
    }); 
} 

function isInvalid(startLocationCode, startTime, endTime) { 
    let timestamp = new Date().toDateInputValue(); 

    let isEmptyCode = startLocationCode === ''; 
    let isYetToStart = new Date(timestamp) < new Date(startTime); 
    let isOver = new Date(timestamp) > new Date(endTime); 

    return isEmptyCode || isYetToStart || isOver; 
} 
0

同期操作のための方法であるため、約束を詳しく見てください。多分あなたのコードを関数にマージしようとします。

1

この約束を返すことができます。呼び出し元で処理してください

関連する問題