JavaScript는 다중 스레드입니까?
내 문제는 다음과 같습니다. jQuery.getScript ()를 사용하여 여러 스크립트를 동적으로 다운로드하고 모든 스크립트가로드 된 후 특정 JavaScript 코드를 실행해야 하므로 계획은 다음과 같습니다.
function GetScripts(scripts, callback)
{
var len = scripts.length
for (var i in scripts)
{
jQuery.getScript(scripts[i], function()
{
len --;
// executing callback function if this is the last script that loaded
if (len == 0)
callback()
})
}
}
이는 각 스크립트에 대한 script.onload 이벤트가 순차적 및 동 기적으로 실행되고 실행된다고 가정하는 경우에만 안정적으로 작동하므로 두 개 이상의 이벤트 핸들러가 (len == 0)에 대한 검사를 통과하고 실행되는 상황은 없습니다. 콜백 메서드.
그래서 내 질문은-그 가정이 옳고 그렇지 않다면 내가하려는 것을 성취하는 방법은 무엇입니까?
아니요, JavaScript는 다중 스레드가 아닙니다. 이벤트 기반이며 순차적으로 발생하는 이벤트에 대한 가정 (순차적으로로드된다고 가정)이 표시됩니다. 현재 구현이 올바른 것 같습니다. 나는 jQuery가 .getScript()새로운 <script>태그를 주입 한다고 믿는다 . 이것은 또한 올바른 순서로로드되도록 강제해야한다.
현재 JavaScript는 다중 스레드가 아니지만 가까운 장래에 상황이 바뀔 것입니다. 가 HTML5의 새로운 일 이라고 노동자 . 백그라운드에서 작업을 수행 할 수 있습니다.
그러나 현재 모든 브라우저에서 지원되는 것은 아닙니다.
자바 스크립트 (ECMAScript를) 사양은 어떤 스레딩 또는 동기화 메커니즘을 정의하지 않습니다.
더욱이 브라우저의 JavaScript 엔진은 부분적으로는 하나 이상의 UI 스레드가 동시에 작동하도록 허용하면 엄청난 수의 웜이 열리기 때문에 부분적으로 단일 스레드입니다. 따라서 귀하의 가정과 구현이 정확합니다.
(!) 참고로, 또 다른 주석이 : 어떤 JavaScriptengine 공급 업체 스레딩 및 동기화 기능을 추가 할 수 있습니다, 또는 공급 업체는 사용자가이 문서에 설명 된대로 사람들은, 스스로 기능을 구현할 수있게 할 수 있다는 사실을 언급 자바 스크립트를 멀티 스레드 ?
JavaScript는 절대 다중 스레드가 아닙니다. 사용하는 모든 핸들러가 다른 이벤트에 의해 중단되지 않도록 보장합니다. 마우스 클릭, XMLHttpRequest 반환 및 타이머와 같은 다른 모든 이벤트는 코드가 실행되는 동안 대기열에 추가되고 차례로 실행됩니다.
아니요, 모든 브라우저는 JavaScript에 대해 단 하나의 스레드 만 제공합니다.
명확하게 말하면 브라우저 JS 구현 은 다중 스레드 가 아닙니다 .
언어 JS가 될 수있는 다중 스레드 .
그러나 여기서는 질문이 적용되지 않습니다.
적용되는 것은 getScript ()가 비동기식 (즉시 반환되고 get이 대기열에 있음)이지만 브라우저는 DOM 첨부 <script>콘텐츠를 순차적으로 실행 하므로 종속 JS 코드가 순차적으로로드 된 콘텐츠를 볼 수 있습니다. 이것은 브라우저 기능이며 JS 스레딩 또는 getScript () 호출에 의존하지 않습니다.
getScript ()가 xmlHTTPRequest, setTimeout (), websockets 또는 기타 비동기 호출을 사용하여 스크립트를 검색 한 경우 스크립트가 순서대로 실행되지 않을 수 있습니다. 그러나 'len'변수의 실행 컨텍스트가 함수의 비동기 호출을 통해 컨텍스트를 유지하는 클로저에 있기 때문에 모든 스크립트가 실행 된 후에도 콜백이 계속 호출됩니다.
" 강제 ", 지연된 스크립트 전달로 이것을 시도하는 것이 흥미로울 것이라고 생각했습니다 .
- Google에서 사용 가능한 두 개의 스크립트를 추가했습니다.
- 두 번째 배열 요소로 delayjs.php를 추가했습니다. delayjs.php는 빈 js 객체를 전달하기 전에 5 초 동안 대기합니다.
- 스크립트 파일에서 예상되는 개체의 존재 를 " 확인 " 하는 콜백을 추가했습니다 .
- GetScripts () 호출 후 행에서 실행되는 몇 가지 js 명령을 " test "순차 js 명령에 추가했습니다.
스크립트로드 결과는 예상대로입니다. 콜백은 마지막 스크립트가로드 된 후에 만 트리거됩니다. 나를 놀라게 한 것은 마지막 스크립트가로드 될 때까지 기다릴 필요없이 GetScripts () 호출을 따르는 js 명령이 트리거된다는 것입니다. 브라우저가 js 스크립트가로드되기를 기다리는 동안 js 명령이 실행되지 않는다는 인상을 받았습니다.
var scripts = [];
scripts.push('http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js');
scripts.push('http://localhost/delayjs.php');
scripts.push('http://ajax.googleapis.com/ajax/libs/scriptaculous/1.8.3/scriptaculous.js');
function logem() {
console.log(typeof Prototype);
console.log(typeof Scriptaculous);
console.log(typeof delayedjs);
}
GetScripts( scripts, logem );
console.log('Try to do something before GetScripts finishes.\n');
$('#testdiv').text('test content');
<?php
sleep(5);
echo 'var delayedjs = {};';
일반적으로 JS는 단일 스레드입니다. 그러나 HTML5 웹 작업자는 다중 스레딩을 도입합니다. http://www.html5rocks.com/en/tutorials/workers/basics/ 에서 자세히 알아보십시오 .
You can probably get some kind of multithreadedness if you create a number of frames in an HTML document, and run a script in each of them, each calling a function in the main frame that should make sense of the results of those functions.
ReferenceURL : https://stackoverflow.com/questions/1663125/is-javascript-multithreaded
'Program Club' 카테고리의 다른 글
| Android : 바이트 단위로 파일을 읽는 방법? (0) | 2021.01.05 |
|---|---|
| 장치를 감지하는 방법은 Android 전화 또는 Android 태블릿입니까? (0) | 2021.01.05 |
| 이름이 변수에 포함 된 Perl 서브 루틴을 어떻게 우아하게 호출 할 수 있습니까? (0) | 2021.01.05 |
| NetBeans가 후행 공백을 제거하고 저장시 탭을 공백으로 변경할 수 있습니까? (0) | 2021.01.05 |
| linq 대소 문자를 구분하지 않음 (toUpper 또는 toLower 제외) (0) | 2021.01.05 |