TL; DR : 때문에 +=
판독 x
하기 전에, 그러나 변경된 후에 의한, 그 기록을 await
두 번째 피연산자 (오른쪽)에서 키워드.
async
함수는 첫 번째 await
명령문 까지 호출 될 때 동기식으로 실행됩니다 .
따라서을 제거 await
하면 일반 함수처럼 작동합니다 (여전히 Promise를 반환하는 것을 제외하고).
이 경우에는 취득 5
및 6
콘솔에서 :
let x = 0;
async function test() {
x += 5;
console.log('x :', x);
}
test();
x += 1;
console.log('x :', x);
은 첫째 await
도 동 기적으로 인수 가능한 경우, 그래서 다음은 반환, 동기 실행을 중지 1
하고 6
예상대로 :
let x = 0;
async function test() {
// Enter asynchrony
await 0;
x += 5;
console.log('x :', x);
}
test();
x += 1;
console.log('x :', x);
그러나 귀하의 경우는 조금 더 복잡합니다.
await
을 사용하는 표현식 안에 넣었습니다 +=
.
JS에서 x += y
와 동일하다는 것을 알고있을 것입니다 x = (x + y)
. 더 나은 이해를 위해 후자의 형식을 사용하겠습니다.
let x = 0;
async function test() {
x = (x + await 5);
console.log('x :', x);
}
test();
x += 1;
console.log('x :', x);
통역사가이 줄에 도착하면 ...
x = (x + await 5);
... 평가를 시작하면 ...
x = (0 + await 5);
... 그러면 도달 await
하고 멈 춥니 다.
함수 호출 이후의 코드는 실행을 시작하고 값을 수정 x
한 다음 기록합니다.
x
지금 1
입니다.
그런 다음 기본 스크립트가 종료 된 후 인터프리터는 일시 정지 된 test
기능 으로 돌아가서 해당 라인을 계속 평가합니다.
x = (0 + 5);
그리고의 값 x
은 이미 대체되었으므로 그대로 남아 있습니다 0
.
마지막으로, 인터프리터는 추가, 저장을 수행 5
하는 x
, 그것을 기록합니다.
객체 속성 getter / setter에 로그인하여이 동작을 확인할 수 있습니다 (이 예에서는 y.z
다음 값을 반영 함) x
.
let x = 0;
const y = {
get z() {
console.log('get x :', x);
return x;
},
set z(value) {
console.log('set x =', value);
x = value;
}
};
async function test() {
console.log('inside async function');
y.z += await 5;
console.log('x :', x);
}
test();
console.log('main script');
y.z += 1;
console.log('x :', x);
/* Output:
inside async function
get x : 0 <-- async fn reads
main script
get x : 0
set x = 1
x : 1
set x = 5 <-- async fn writes
x : 5 <-- async fn logs
*/
/* Just to make console fill the available space */
.as-console-wrapper {
max-height: 100% !important;
}
await (x += 5)
하고x += await 5
.