2017-04-07 1 views
0

데이터베이스 (MySQL)에서 4 개 또는 5 개의 항목을 검색 한 다음 결과에서 일부 수학을 수행 한 다음 결과를 함수를 호출 한 코드의 주요 부분으로 리턴해야하는 노드 코드의 한 지점에 있습니다 . 이러한 함수 또는 함수에서 반환 된 데이터가있을 때까지는 코드에서 실제로 이동할 수 없습니다.중첩 된 NON 차단 기능이 포함 된 노드 차단 기능?

내가 읽은 모든 것은 노드를 사용하는 데있어 모든 기쁨과 아름다움을 빼앗기 때문에 동기 기능을 만들지 않는다고 말합니다. 그러나 필자는 문자 그대로 함수의 결과가 없으면 코드를 실행할 수 없습니다.

여기에 동기 기능이 필요하지 않습니까? 그렇다면 왜 그렇게 잘못 생각합니까? LOL.

나는 실제로 작업을 수행하는 4 또는 5 개의 함수가 포함 된 하나의 큰 외부 함수를 생각했습니다. 내포 된 함수를 비동기로 만들어 외부 함수 (컨테이너)를 동기식으로 만들 수 있습니다.

이 문제에 대한 의견이 있으십니까? Node를 처음 사용하고 처음부터이 작업을 올바르게 수행하려고합니다.

+2

당신은 그렇게 할 수 없습니다. 대신 약속을 사용해야합니다. – SLaks

+0

node.js는 문자 그대로 비동기 작업이 끝나기를 기다리지 않아도 계속 실행됩니다. 함수 내에 내장 비동기 조작이 있으면이 전체 기능은 이제 비동기입니다. 값을 반환 할 수 없습니다. 토론에 대한 자세한 내용은 [비동기 적 호출의 응답을 반환하는 방법] (http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call)을 참조하십시오. 당신의 선택. 약속이나 콜백이 사용됩니다. – jfriend00

답변

1

계속하기 전에 여러 I/O 작업이 완료 될 때까지 기다리는 것이 일반적인 문제입니다. 특히 노드 + 데이터베이스의 경우 더욱 그렇습니다. 가능한 한 비동기로 async를 시도하고 프로그램의 논리적 흐름이 절대적으로 요구할 때만 차단합니다. "중첩 된 함수를 비동기로 만드는"아이디어는 괜찮습니다.

Promise.all을 사용하면 모든 비동기 작업을 시작할 수 있습니다. 약속의 결과를 기다리는 경우 Promise.all이 완료 될 때까지 다음 코드 행으로 이동하지 않습니다.

여기에 바보 같지만 설명이 가능한 기능 이름이있는 코드가 있습니다.

async function processIAmTryingToDoAsAsynchAsPossible(allCommandsToExecute) { 
    try { 
    // go get all the data asynchronously and destructure the results. But only move to the next line 
    // once all the async calls have returned 
    const [firstResult, secondResult, thirdResult] = await Promise.all(allCommandsToExecute.map(eachCommandToExecute => executeSqlFunction(eachCommandToExecute))); 

    // assuming it is just math, this is not an i/o operation so it will execute "synchronously" 
    const finalMathProduct = doMathOnThisStuff(firstResult, secondResult, thirdResult); 

    // assuming this is an i/o operation and the final function returns something you need 
    return await functionWeCallAfterGettingTheData(finalMathProduct); 
    } catch (err) { 
    // You'll get here if the Promise.all has a reject, if the final function errors out, 
    // or if you throw an error in one of the other functions. 
    throw err; 
    } 
}