>source

누군가 나에게 왜 이런 식으로 행동하는지 설명할 수 있습니까?

내가 아는 한,잠을 기다리다(1)이 경우 code 흐름에 영향을 주지 않아야 합니다. 하지만 그렇게 합니다.

function sleep(time) {
  return new Promise((r)=> setTimeout(r, time));
}
async function test(target) {
    const ids= { a: ['a1', 'a2'], b: ['b3', 'b4'] }[target];
    for (id of ids) {
        console.log('X.', target, id);
        //await sleep(1);
        console.log('Y.', target, id);
    }
}
test('a');
test('b');

왜?

감사합니다!

디버깅을 더 쉽게 하기 위해 스택 조각으로 두 예제를 모두 포함할 수 있습니까? 자세한 내용은 code 이미지를 업로드하면 안 되는 이유를 참조하세요.

Reyno2021-10-18 12:45:23

test('')를 기다려야 하기 때문입니다. 테스트('b')를 기다립니다. 현재 두 개의 비동기 작업을 동시에 실행하고 있습니다. 또한 id는 전역 변수이므로 두 작업 모두 동일한 변수를 동시에 재사용하고 덮어씁니다. 혼란스러운 결과가 나오는 것도 당연합니다. :)

Jeremy Thille2021-10-18 12:52:23

for(id of는 id를 전역으로 만들고 for(const id of)를 사용하여 for 루프에 로컬로 만듭니다.

Nick Parsons2021-10-18 12:52:34
  • 답변 # 1

    사용해 보세요for (id의 const id) {. 없이상수또는허락하다, 당신은 정의하고 있습니다ID글로벌 범위에.

    function sleep(time) {
      return new Promise((r)=> setTimeout(r, time));
    }
    async function test(target) {
        const ids= { a: ['a1', 'a2'], b: ['b3', 'b4'] }[target];
        for (const id of ids) {
            console.log('X.', target, id);
            await sleep(1);
            console.log('Y.', target, id);
        }
    }
    test('a');
    test('b');
    

    감사합니다! 이것이 바로 문제입니다!

    Tony Dinh2021-10-18 13:18:38
  • 답변 # 2

    당신은 기다리고 있지 않습니다종피')끝내기 위해.

    언제테스트('b')도달,종피')(비동기 함수이기 때문에) 여전히 실행 중입니다. 다른 것을 시작하기 전에 끝내고 싶다면.그 다음에():

    test('a').then(()=>test('b'));
    

  • 이전 python : 재귀: 함수가 1을 반환하는 대신 숫자의 계승을 반환하는 이유는 무엇입니까?
  • 다음 python : while 루프가 예상대로 실행되지 않습니다.