Почему Firefox ожидает завершения работы функции JavaScript, чтобы запустить другую функцию? - PullRequest
3 голосов
/ 29 июля 2010

мы разрабатываем веб-приложение с использованием GWT во внешнем интерфейсе.

В GWT мы совершаем звонки на сервер, добавляя код JavaScript, как указано ниже:

    public native static void call(int requestId, String url, ICall handler) /*-{
   var callback = "callback" + requestId;

   //Create a script element.
   var script = document.createElement("script");
   script.setAttribute("src", url+callback);
   script.setAttribute("type", "text/javascript");
   script.setAttribute("async", "true");

   //Define the callback function on the window object.
   window[callback] = function(response) {
     handler.@com.xxx.yyy.gui.net.ICall::handleResponse(Ljava/lang/String;)(response);
   } 

   //Attach the script element to the document body.
   document.body.appendChild(script);
  }-*/;

Некоторые вызовы занимают минуту, а другие - всего пару секунд.Если мы делаем несколько вызовов одновременно, все они выполняются параллельно.Это означает, что вызов, который заканчивается через 2 секунды, не должен ждать, пока вызов, который длится минуту, завершится.Это верно в Chrome и Safari.Однако Firefox ожидает, пока первая вызванная функция не завершит запуск других функций.

Почему Firefox ждет, пока функция javascript не завершит запуск другой функции?Как это исправить?

Спасибо

Ответы [ 4 ]

2 голосов
/ 29 июля 2010

Вы можете использовать HTML5 с многопоточным JavaScript через веб-работников.Сначала проверьте, поддерживает ли ваш браузер это.

function supports_web_workers() {
  return !!window.Worker;
}

Затем начните использовать многопоточность.

   // thread1
   var myBread = new Worker('bread.js');

   // thread2
   var myButter = new Worker('butter.js');

Я никогда не пробовал сам, поэтому поправьте меня, если я ошибаюсь.

0 голосов
/ 29 июля 2010

Ваш вопрос немного неправильный, потому что вы используете не xhr, как вы думаете, а инъекции скриптов (jsonp). В этом случае Firefox загружает файлы параллельно, но исполняет файл в порядке, который файлы отправили в DOM.

0 голосов
/ 29 июля 2010

JavaScript в сети является однопоточным, если вы не используете рабочие потоки (начиная с Firefox 3.5).Так работает веб, и все браузеры будут работать одинаково.

0 голосов
/ 29 июля 2010

Возможно, вам придется явно потоковать процессы, чтобы Firefox запускал их параллельно (у Firefox не было последней версии, поэтому их поддержка параллельной работы может быть слабее, чем у недавно обновленных chrome и safari). Может также случиться так, что Firefox имеет определенные затруднения при доступе к объекту из нескольких методов одновременно.

Любая причина, почему код весь закомментирован?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...