2016-07-31 7 views
1

보통 Node.JS라는 콜백 스프를 즐길 수는 있지만 SQLite 문제 때문에 블로킹 방식으로 코드의 특정 부분을 실행해야합니다. . (예, SQLite 부분을 시험해보고 해결할 수 있다는 것을 알고 있습니다. 실제로 차단을 보장하는 것이 더 합리적입니다.) async 모듈을 사용하는 것을 좋아하지만 사용할 수있는 기능이 있다고 생각합니다. 여기, 나는 그것을 찾을 수없는 것 같습니다. 아니면 더 나은 모듈이있을 수도 있습니다. 어쨌든, 속히 : ////에 둘러싸여 코드의Node.JS 루프에서 블로킹을 방지하는 방법

func = function(callback) { 
    let i = 0; 
    arr.forEach(val => { 
     if (val.trim().length > 0) { 
      console.log(`Starting for user ${val}.`); 
      let mylc = new lcapp(val); 
      ////// TODO this needs to be made sycnronous. ///// 
      async.series({ 
       getMyDetails: callback => getMyDetails(mylc, callback) 
      }, (err, results) => handleResults(err, results, mylc, callback)); 
      ///////////// 
     } 
    }); 
}; 

섹션 나는 handleResults 함수가 반환 될 때까지 차단하고 싶습니다. 내가 handleResults, 또는 어쩌면 내가 func 주위에 부모 함수를 작성해야하지만 난 StackOverflow 사람들이 좋은 아이디어가 있는지보고 싶습니다 재 프로그래밍이 필요합니다 이해합니다.

답변

0

예, 저는 SQLite 부분을 시도하고 해결할 수 있음을 알고 있습니다. 실제로 차단을 보장하는 것이 더 효과적입니다.

아니야, 할 수 없기 때문에. 비동기 코드를 동기 코드로 변환 할 수있는 방법이 없으므로 비동기로 인한 문제를 해결해야합니다.

+0

SQLite 외에도이 기간 동안 100MB 파일을 다운로드한다는 사실을 잊어 버렸습니다. 루프에서 모든 콜백을 비동기 적으로 진행하는 것과 같은 다운로드는하지 않을 것입니다. –

1

handleResultscallback이 맞으면 재귀 적으로 호출되는 함수로 변환 할 수 있습니다.

아래 예를 따라이 작업을 수행 할 수 있습니다.

fun() 

function fun() { 
    console.time("fun") 
    var arr = [1, 2, 3, 4, 5] 
    var i = arr.length - 1; 
    doStuff(doStuffCallback) 

    function doStuffCallback() { 
    if (i > 0) { 
     i-- 
     doStuff(doStuffCallback) 
    } else { 
     console.timeEnd("fun") 
    } 
    } 

    function doStuff(callback) { 
    setTimeout(function() { 
     logIt() 
     callback() 
    }, 25) 
    } 

    function logIt() { 
    console.log(arr[i]) 
    } 
} 

// Output: 
// 5 
// 4 
// 3 
// 2 
// 1 
// fun: about 160ms 

추신 :이 방법과 그 안에있는 루프 내에서만 동기화가 필요하다고 가정합니다. 이 코드가 실행되는 동안 다른 코드가 여전히 응용 프로그램의 다른 위치에서 실행 중일 수 있습니다.

관련 문제