비동기 호출은 현재 스레드에 대해 비차단이므로 비동기 처리가 완료되었는지, 오류가 발생했는지 알고 싶다면 일반적으로 Node.js에서 흔히 볼 수 있는 이벤트나 콜백을 통해 알 수 있습니다. Ajax는 매우 일반적인 비동기 호출입니다. jQuery.ajax를 예로 들어보겠습니다
으아악
jQuery의 Ajax는 jQuery의 Promise 객체를 반환합니다. 일반적으로done()回调来处理调用完成之后的事情。但实际它也有标准 Promise 的then(),所以上面的done是可以改成then的,但是要注意,done是以事件的形式注册回调,它返回当前这个 Promise 对象本身,可以链式调用注册若干个回调。而then를 사용하여 다른 Promise 객체를 반환합니다(표준 Promise 사양). 호출이 연결되면 각 호출은 동일한 Promise 객체에서 작동하지 않습니다.
콜백에서 또 다른 비동기 호출을 해야 하는 경우 콜백에 다른 콜백을 등록해야 합니다. 예를 들어 특정 데이터를 얻으려면 먼저 api1에서 특정 값을 얻은 다음 이 값을 사용하여 api2에서 특정 리소스를 얻은 다음 이 리소스의 특정 값을 사용하여 api3에서 이 값을 가져와야 합니다. 작성하면 다음과 같습니다. :
으아악
이것은 단지 세 번째 수준입니다... 매우 무서운 형태입니다. 이 형식을 "콜백 지옥"이라고 합니다.
모두가 이 문제를 해결하기 위해 여러 가지 방법을 생각해 보았는데, Promise도 그 중 하나이지만 Promise는 아직 이 형태를 완전히 없앨 수는 없습니다. co 라이브러리도 해결책 중 하나이지만 완전히 없앨 수는 없습니다.
그러나 ES2017에서는 소위 비동기식 쓰기를 동기 형식으로 하는 async/await를 도입했습니다. 예를 들어 위의 코드는
로 다시 작성할 수 있습니다. 으아악
async/await는 콜백을 제거하므로 비동기(즉, 동기) 코드를 작성하는 것과 동일해 보입니다.
비동기 호출은 현재 스레드에 대해 비차단이므로 비동기 처리가 완료되었는지, 오류가 발생했는지 알고 싶다면 일반적으로 Node.js에서 흔히 볼 수 있는 이벤트나 콜백을 통해 알 수 있습니다. Ajax는 매우 일반적인 비동기 호출입니다. jQuery.ajax를 예로 들어보겠습니다
으아악jQuery의 Ajax는 jQuery의 Promise 객체를 반환합니다. 일반적으로
done()
回调来处理调用完成之后的事情。但实际它也有标准 Promise 的then()
,所以上面的done
是可以改成then
的,但是要注意,done
是以事件的形式注册回调,它返回当前这个 Promise 对象本身,可以链式调用注册若干个回调。而then
를 사용하여 다른 Promise 객체를 반환합니다(표준 Promise 사양). 호출이 연결되면 각 호출은 동일한 Promise 객체에서 작동하지 않습니다.콜백에서 또 다른 비동기 호출을 해야 하는 경우 콜백에 다른 콜백을 등록해야 합니다. 예를 들어 특정 데이터를 얻으려면 먼저 api1에서 특정 값을 얻은 다음 이 값을 사용하여 api2에서 특정 리소스를 얻은 다음 이 리소스의 특정 값을 사용하여 api3에서 이 값을 가져와야 합니다. 작성하면 다음과 같습니다. :
으아악이것은 단지 세 번째 수준입니다... 매우 무서운 형태입니다. 이 형식을 "콜백 지옥"이라고 합니다.
모두가 이 문제를 해결하기 위해 여러 가지 방법을 생각해 보았는데, Promise도 그 중 하나이지만 Promise는 아직 이 형태를 완전히 없앨 수는 없습니다. co 라이브러리도 해결책 중 하나이지만 완전히 없앨 수는 없습니다.
그러나 ES2017에서는 소위 비동기식 쓰기를 동기 형식으로 하는 async/await를 도입했습니다. 예를 들어 위의 코드는
로 다시 작성할 수 있습니다. 으아악async/await는 콜백을 제거하므로 비동기(즉, 동기) 코드를 작성하는 것과 동일해 보입니다.
참조:
비동기 호출의 "평탄화"에 대해 이야기해 보세요
지옥에서 천국으로, 노드 콜백이 async/await로 변경됩니다
JavaScript의 async/await 이해하기
다음과 같은 형식으로 비동기식으로 콜백 함수를 중첩하는 것이 일반적입니다.
으아악이때 레이어별로 중첩해야 하는 콜백 중첩이 나타나 오류가 발생하기 쉽고 유지 관리도 어렵습니다.
동기 모드에서 비동기적으로 작성하는 것은 다음과 유사합니다.
으아악이때 비동기식 비즈니스 로직은 일반 동기화를 통해 구현됩니다.
동기적으로 비동기적으로 작성한다는 것은 코드의 구성 형태를 의미합니다. async/await를 사용하여 동기식으로 비동기식으로 작성할 수 있습니다. 다음 코드를 참조하세요.
으아악
를 인쇄합니다.f
是一个异步操作,如果不使用async/await,直接同步的方式打印t,结果肯定是undefined
; async/await를 사용한 후에도 코드는 여전히 동기적으로 보이지만 내부에서는 먼저 비동기 작업 f를 실행한 다음 t위 두 답변이면 충분합니다