어떤 자바 스크립트 함수가 차단 및 비 차단을 결정합니까?


27

나는 몇 년 동안 웹 기반 Javascript (vanilla JS, jQuery, Backbone 등)를 해왔으며 최근에는 Node.js와 함께 일하고 있습니다. "비 차단"프로그래밍을 중단하는 데 시간이 걸렸지 만 이제는 IO 작업에 콜백을 사용하는 방법에 익숙해졌습니다.

Javascript는 본질적으로 단일 스레드입니다. 노드 "이벤트 큐"의 개념을 이해합니다. 내가 이해하지 못하는 것은 개별 자바 스크립트 작업이 "차단"대 "비 차단"인지 여부를 결정하는 것입니다. 나중 코드에서 사용하기 위해 동 기적으로 출력을 생성하기 위해 어떤 작업을 의존 할 수 있는지, 그리고 초기 작업이 완료된 후 출력을 처리 할 수 ​​있도록 콜백을 전달해야하는 작업을 어떻게 알 수 있습니까? 비동기 / 비 차단 인 Javascript 함수 목록과 동기 / 차단 기능이있는 목록이 있습니까? Javascript 앱이 하나의 거대한 경쟁 조건이되는 것을 방해하는 이유는 무엇입니까?

노드의 IO 작업 및 웹에서의 AJAX 작업과 같이 시간이 오래 걸리는 작업은 비동기식이어야하므로 콜백을 사용해야합니다. 그러나 누가 "오래된"것으로 평가되는지 결정합니다. 이러한 작업 내에 일반 "이벤트 큐"에서 제거하는 트리거가 있습니까? 그렇지 않다면 변수에 값을 할당하거나 배열을 반복하는 것과 같은 간단한 작업과 다른 점은 무엇입니까? 동기 방식으로 마무리하는 데 의존 할 수 있습니까?

아마도 나는 이것을 올바르게 생각조차하지 못합니다. 누군가 나를 똑바로 설 수 있기를 바랍니다. 감사!


이것은 내가 실제로 찾은 것인데, 귀하의 질문에 대한 당신의 대답은 당신이 방법이 비동기인지 확인하기 위해 문서를 확인해야한다는 것입니다.
Anastasios Andronidis 2016 년

답변:


13

일반적으로 네트워킹을 수행하거나 타이머를 사용하여 일정 기간 동안 작업을 수행하는 모든 기능은 비동기 적입니다.

함수가 콜백을 받으면 콜백이 사용되는 것을 볼 수 있으며 일반적으로 비동기인지 아닌지 알 수 있습니다. 함수가 콜백을 제공하지 않으면 비동기 결과를 전달할 방법이 없으므로 비동기가 아닐 수 있습니다.

확실한 방법은 없습니다. 그것은 기능을 위해 문서에서 작성되거나 인터페이스가 작동하는 방식에서 분명해야합니다.

비동기 작업은 비동기 작업이 작업을 설정하고 작업을 시작한 다음 나중에 작업 진행, 완료 또는 오류에 대한 알림을 받는다는 개념에서 동기 작업과 다릅니다. 배열 반복은 동기 작업입니다. 이러한 문제는 없습니다. 코드는 동기식으로 만 실행됩니다. 아약스 호출은 상태 알림에 대한 콜백을 등록한 다음 아약스 호출을 시작한 다음 다른 자바 스크립트를 계속 실행 한 다음 잠시 후에 아약스 호출의 상태 변경 (예 : 완료)으로 콜백이 호출됩니다.


1
참고로 일부 Javascript 함수는 매개 변수에 따라 차단 및 비 차단 모두입니다. 예를 들어, 나중에 호출 이 비동기 인지 여부를 제어 XMLHttpRequest.open하는 부울 async매개 변수가 있습니다 send.
Brian

이 답변이 도움이되지 않고 일반적으로 설명되지 않았습니다.
Mehdi Raash

@MehdiRaash-정답은 문서 나 인터페이스에서 알아내는 것입니다. 다른 방법은 없습니다. 이것이 이것이 말하는 것입니다. 당신이 무엇을 기대하고 있는지 잘 모르겠습니다. 마법의 총알 답변이 없습니다.
jfriend00

6

내가 이해 한 바에 따르면 비동기로 만들어야 것이 아니라 함수가 비동기인지 확인하는 방법을 묻습니다 .

설명서를 확인하십시오. 진심으로-그것이 바로 그 일입니다. 이름이나 컨텍스트를 기반으로 함수가 무엇을하는지 추측 할 수 없습니다. 확실하지 않고 소스 코드에 액세스 할 수 있는지 확인하십시오.

이것이 완전히 신뢰할 수있는 유일한 방법입니다.

이제 추측하기 위해.

  • 콜백을 수락하거나 약속을 반환하면 아마도 비동기 일 것입니다 (해당 규칙에 대한 예외를 보았습니다)
  • 일반적으로 node.js 및 더 일반적으로 JavaScript에서 입출력과 관련된 모든 것은 비동기식으로 수행됩니다 (그 규칙에 대한 예외도 보았습니다)

4

JavaScript는 다음 중 하나가 발생할 때까지 모든 처리 블록을 단일 스레드하므로

1) 현재 실행은 I / O 또는 네트워킹 요청 또는 웹 워커 요청과 같은 외부 서비스를 요청합니다.

2) 함수 호출은 나중에 실행될 타이머에 놓입니다.

차단 / 비 차단 기능 목록이 없습니다. 설명서를 확인해야합니다.

여러 외부 서비스가 자바 스크립트 스레드를 잠그고 동시에 액세스하려고하면 앱에서 경쟁 조건이 발생할 수 있습니다. 최신 브라우저와 V8 엔진이이를 처리하지만 phonegap을 사용하고 모바일 장치 용 자바 스크립트 앱을 작성하면이 경쟁 조건이 발생할 수 있습니다. 이러한 경쟁 조건을 처리하기위한 지원은 없습니다.

일반적으로 콜백이 없으면 코드가 차단된다고 가정합니다. 콜백이 있어도 차단되지 않는다는 의미는 아닙니다.


-1

나도 node.js (일반적으로 JavaScript)를 처음 사용하고 많은 비동기 코드에 익숙하지 않습니다. 난 그냥에서 지적하고 싶었 비는-차단 대 차단의 개요nodejs.org 는 그 상태 :

Node.js 표준 라이브러리의 모든 I / O 메소드는 비 블로킹 인 비동기 버전을 제공하고 콜백 함수를 허용합니다. 일부 방법에는 동기화로 끝나는 이름을 가진 차단 대응 물도 있습니다.


1
이 질문은 어떻게 질문을 해결합니까? 참조 답변하는 방법
모기
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.