2017-12-15 12 views
3

현재 async/await의 개념을 javascript에서 탐색 중입니다. 비동기 함수가 향후에 해결할 것으로 예상되는 약속을 반환하고 차단하지 않는다는 것을 알고 있습니다. 코드의 자연스런 실행. 자바 스크립트의 비동기 실행을 테스트하기 위해 작성한 코드가 있습니다.()비동기 함수 내부의 코드가 다음 코드 앞에 실행됩니다.

첫 CONSOLE.LOG 1

이 두 번째 비동기 함수가 호출 인쇄 :

console.log("1") 
async function asyncFunc(){ 
    for(i=0;i<10000000;i++){ 
    } 
    console.log("3") 
} 
asyncFunc().then(()=>{console.log('4')}); 
console.log("2"); 

I 코드를 제외하고

는 다음과 같은 방식으로 실행됩니다. 비동기 코드가 블로킹 (non blocking)이기 때문에 마지막 console.log()가 실행되어 콘솔에 2를 출력합니다.

비동기 함수의 console.log()가 실행되고 콘솔에 3이 인쇄됩니다.

마지막 약속 해결 및 CONSOLE.LOG() then 내부 실행되고됩니다 인쇄

4. 그래서 예상 출력 : 1,2,3,4는

그러나 실제로 나는 출력을 얻을 1,3,2,4로.

는 왜이 같은 행동이 아닌 방법으로 내가 그것을 실행이 완료 될 때까지

+0

aync 키워드는 실제로 불행히도 async 함수에서 코드를 실제로 만들지 않습니다. –

+0

함수를 강제로 비동기 적으로 실행하려면'await Promise.resolve()'를 함수의 첫 번째 줄에 추가하십시오. – Brandon

답변

5

이 기능은 약속을 반환하지 않습니다 예상 (당신 await 그 안에 또 다른 약속을하지 않는 한).

루프가 실행되고 (모든 블로킹) console.log("3")이 평가되면 약속이 반환됩니다.

호출 기능이 계속 실행됩니다 (로깅 2).

마지막으로 이벤트 루프가 해제되고 then에 전달 된 함수가 호출됩니다.

async로 함수를 표시해도 비동기 코드로 동기화 코드가 변환되지 않습니다.

+0

비동기로 선언하고 있습니다. async.if가 여전히 블록킹 된 것을 예상합니까? –

+2

@ AL-zami - 콜백 대신 리턴 값을 처리하는 구문을 사용할 수 있으므로 async 인 코드를 처리 할 때 더 유용한 구문을 제공합니다. – Quentin

+0

마지막 코멘트는 불행히도 파악하기가 더욱 어려워졌습니다. ( –

1

여기에 늦게 답변하고 Quentin은 정확합니다. 그러나 때때로 이러한 것들을 다이어그램으로 나타내는 것이 좋습니다. 이제 정말 간단 async 기능을 살펴 보자 :

async function foo() { 
    console.log("a"); 
    await something(); 
    console.log("b"); 
    return 42; 
} 

그 기능은 두 부분이있다 : 위로는 await 또는 return는 (그냥 끝나거나 첫번째 경우 (그러나 포함하지 않음)에 대한 모든 :

  • 동기 부분을). 그래서 위에서는 console.log("a");이고 something (그 결과를 기다리는 비트는 아닙니다)에 대한 호출입니다.
  • 비동기 부분 : 그 뒤의 내용은 모두 await입니다.우리가 명시 적 약속과 그 기능을 다시한다면

, 그것은을이 (손을 흔들며 멀리 세부 사항)과 같이 보일 것입니다 :

async function asyncFunc(){ 
    for(i=0;i<10000000;i++){ 
    } 
    console.log("3") 
} 
:

function foo() { 
    console.log("a"); 
    return something().then(() => { 
     console.log("b"); 
     return 42; 
    }); 
} 

그래서 함수보고

... 우리는 의 코드에서이 초기 동기 부분에 있고 그로 인해 반환되는 약속이 undefined으로 해결되었습니다.

그래서 합니까 async 함수는 동기 부분이 있습니까? 동일한 이유로 new Promise에 전달되는 executor 함수가 동 기적으로 실행됩니다. 따라서 작업을 바로 시작할 수 있습니다.

가정 해 우리 주위에 우리가 JSON 응답을 기대 fetchasync 래퍼를하고 싶었다 : 그 동기 부분 (fetch(...args)에 전화를) 가지고 있지 않은 경우, 그것은 아무것도하지 않을 것

async function fetchJSON(...args) { 
    const response = fetch(...args); 
    return response.json(); 
}; 

및 그 약속은 결코 해결되지 않을 것입니다.