Подтвердить что ты не робот

Является ли 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 для каждого огня script и выполняются последовательно и синхронно, поэтому никогда не будет ситуации, когда два или более обработчика событий будут проходить проверку ( len == 0) и выполнить метод обратного вызова.

Итак, мой вопрос - это предположение правильно, а если нет, то каким способом добиться того, что я пытаюсь сделать?

4b9b3361

Ответ 1

Нет, JavaScript не многопоточен. Это событие управляется, и ваше предположение о том, что события последовательно запускаются (при условии, что они загружаются последовательно), - это то, что вы увидите. Ваша текущая реализация выглядит правильно. Я верю, что jQuery .getScript() вводит новый тег <script>, который также должен заставить их загружаться в правильном порядке.

Ответ 2

В настоящее время JavaScript не многопоточен, но в ближайшем будущем все изменится. В HTML5 есть называемая Worker. Это позволяет выполнять некоторую работу в фоновом режиме.

Но в настоящее время он не поддерживается всеми браузерами.

Ответ 3

спецификация JavaScript (ECMAScript) не определяет механизмы потоков или синхронизации.

Кроме того, движки JavaScript в наших браузерах преднамеренно однопоточны, отчасти потому, что одновременное использование нескольких потоков пользовательского интерфейса может открыть огромную банку червей. Таким образом, ваше предположение и реализация верны.

В качестве оповещения, еще один комментатор ссылался на то, что любой поставщик JavaScript-объявления может добавлять функции потоковой передачи и синхронизации, или поставщик может позволить пользователям реализовать эти функции самостоятельно, как описано в этой статье: Многопоточный JavaScript

Ответ 4

JavaScript абсолютно не многопоточен - у вас есть гарантия, что любой обработчик, который вы используете, не будет прерван другим событием. Любые другие события, такие как щелчки мыши, возвращаемые XMLHttpRequest, и таймеры будут стоять в очереди во время выполнения вашего кода и запускаться один за другим.

Ответ 5

Нет, все браузеры дают вам только один поток для JavaScript.

Ответ 6

Чтобы быть ясным, реализация браузера JS не многопоточна.

Язык , JS, может быть многопоточным.

Однако вопрос здесь не применяется.

Что применяется, так это то, что getScript() является асинхронным (немедленно возвращается и ставится в очередь), однако браузер будет выполнять DOM при вставке <script> контента последовательно, так что ваш зависимый JS-код будет видеть их загруженными последовательно. Это функция браузера и не зависит от потока JS или вызова getScript().

Если getScript() восстановил скрипты с помощью xmlHTTPRequest, setTimeout(), веб-сайтов или любого другого асинхронного вызова, ваши скрипты не будут гарантированно выполняться по порядку. Тем не менее, ваш обратный вызов все равно будет вызван после того, как все скрипты будут выполняться, так как контекст выполнения вашей переменной "len" находится в закрытии, который сохраняет контекст через асинхронные вызовы вашей функции.

Ответ 7

Думал, что было бы интересно попробовать это с помощью "принудительной", отложенной доставки script...

  • добавлено два доступных скрипта из Google
  • добавил delayjs.php как второй элемент массива. delayjs.php спит за 5 секунд до доставки пустого js объект.
  • добавлен обратный вызов, который "проверяет" существование ожидаемые объекты из script файлы.
  • добавлено несколько команд js, которые выполняются на линии после GetScripts(), для "проверки" последовательных js-команд.

Результат с нагрузкой script такой же, как ожидалось; обратный вызов запускается только после загрузки последнего script. Меня поразило то, что команды js после вызова GetScripts() запускались без необходимости ждать загрузки последнего script. У меня создалось впечатление, что никакие команды js не будут выполнены, пока браузер ждет js script для загрузки...

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 = {};';

Ответ 8

Вероятно, вы можете получить некоторую многопоточность, если вы создаете несколько фреймов в документе HTML и запускаете script в каждом из них, каждый из которых вызывает функцию в главном фрейме, которая должна понимать результаты эти функции.