2017-10-26 10 views
-3

나는 코드 조각이 :자바 스크립트 계속 foreach는

var a = false; 

function wait(milliseconds, async) { 
if(!async) { 
setTimeout(function() { 
     console.log('Sync timer done.'); 
     a = true; 
     return true; 
    }, milliseconds*1000); 
} 
(...) 
f_recipe.forEach(function(item, index) { 
    if (obj['actual_step'] != 0 && obj['actual_step'] != index) { 
      e = "Desync"; 
     throw e; 
    }; 
    console.log("Step: " + obj.actual_step); 
    if(item.substr(item.length - 6) != "false)"){ 
     if (eval(item)) { 
     obj['actual_step']++; 
     } 
    } else { 
     eval(item); 
     var ival = setInterval(function(){ 
      if(a) { 
       console.log('do the next thing'); 
       clearInterval(ival); 
      } 
     }, 1000); 
    } 
}); 

을하지만 난에 도착하면 (간격 완성은)는 foreach 루프가의 다음 요소로 계속되지 않습니다 '다음 일을' 정렬. 'a'는 타임 아웃 후 (JS에서 동기 대기의 종류) true로 설정됩니다. f_recipes는 함수 호출을 포함하는 문자열 배열입니다 (예 : 'wait (20, false)').

어떻게 작동합니까?

+0

I 돈을 인터벌의 기능이 당신이 기대하는 컨텍스트를 가질 것이라고 생각하지 않습니다. – DBS

+0

'a' 란 무엇입니까? 설정되는 곳은 어디입니까? 이 코드가 해독을 기대하기보다는 어떻게해야하는지 설명하십시오. – JLRishe

+1

코드가 수행해야 할 작업이 무엇인지 명확하게 알 수는 없지만이 작업이 잘못된 접근이라고 확신합니다. – JJJ

답변

0

은 당신이 할하려는 것은 아주 나쁜 생각처럼 보이지만, 약속은 (는 Promise.delay 제공하고 Promise.each 때문에 여기에 블루 버드를 사용하여)이 도움이 될 수 있습니다 :

function wait(seconds, dontActuallyWait) { 
 
    return dontActuallyWait ? null : Promise.delay(seconds * 1000); 
 
} 
 

 
function runSequence(things) { 
 
    return Promise.each(things, function(thing) { 
 
    return eval(thing); 
 
    }); 
 
} 
 

 
runSequence([ 
 
    'console.log("hello")', 
 
    'wait(2, false)', 
 
    'console.log("hello again")', 
 
    'wait(5, false)', 
 
    'console.log("goodbye")' 
 
]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.5.1/bluebird.min.js"></script>