параллелизм javascript - PullRequest
       21

параллелизм javascript

5 голосов
/ 13 января 2010

Ну, во-первых, я хочу сказать, что я немного новичок в мире интернет-разработок.

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

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

Одновременно ли выполняются такие методы, как setTimeout, например

setTimeout(func1, 0);
setTimeout(func2, 0);

...

function func1()
{
   webMethod1(function() {alert("function 1 returned"); } );
}

function func1()
{
   webMethod2(function() {alert("function 2 returned"); } );
}

Отредактировано

Я только что нашел эту статью, которая может быть очень полезной для выпуска следующих браузеров: Веб-работники Javascript

Ответы [ 5 ]

7 голосов
/ 13 января 2010

Существует один единственный поток выполнения в Javascript в обычных веб-браузерах: ваши обработчики таймера будут вызываться последовательно. Ваш подход с использованием таймеров будет работать в том случае, если вы представляете.

Есть замечательная документация по таймерам от Джона Резига (автора очень популярной платформы jQuery javascript - если вы новичок в веб-разработке, я бы посоветовал вам посмотреть это).

Теперь, если вы имеете в виду браузеры на основе HTML5, в какой-то момент у них должна быть поддержка потоков.

2 голосов
/ 13 января 2010

Ну, JavaScript это однопоточный , два таймера будут работать последовательно один за другим, даже если вы этого не замечаете.

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

И в качестве альтернативы вы можете взглянуть на WebWorkers , способ запуска скриптов в отдельных фоновых потоках, но они поддерживаются только современными браузерами.

2 голосов
/ 13 января 2010

Да, именно так работают веб-запросы через AJAX. Не нужно setTimeout до 0, вы можете просто вызывать их один за другим и делать запрос AJAX, и он будет выполняться асинхронно, что позволит вам передать функцию обратного вызова, которая будет вызвана после завершения запроса.

Средства создания запроса AJAX отличаются в зависимости от того, какой браузер вы используете. Если вы собираетесь создавать что-то, что в значительной степени зависит от AJAX, и вы хотите, чтобы оно работало в нескольких браузерах, лучше всего использовать библиотеку. Вот как это делается в jQuery, например:

$.ajax({ url: '/webrequesturl', success: function(result) {
    // this will be called upon a successful request
} });
$.ajax({ url: '/webrequest2url', success: function(result) {
    // this will be called upon a successful request
    // this may or may not be called before the above one, depending on how long it takes for the requests to finish.
} });
0 голосов
/ 13 января 2010

То, что вы ищете, это асинхронный клиент-серверный обмен (ключевое слово: асинхронный). Асинхронные функции сразу возвращаются, но предоставленный обратный вызов будет выполнен после выполнения указанного условия.

Таким образом, если функция, отправляющая запрос на сервер, является асинхронной, это позволит вам отправить оба запроса на сервер, не ожидая ответа.

Использование setTimeout может работать, так как это запланирует вызов обеих функций отправки запроса. Тем не менее, некоторые браузеры одновременно запускают только один поток Javascript, поэтому в результате одна из запланированных функций будет работать и блокироваться (в ожидании ответа), а другая запланированная функция будет ожидать, пока не будет выполнена первая из них, чтобы начать работу ,

Желательно использовать асинхронную поддержку из библиотеки взаимодействия с сервером. Например, jQuery по умолчанию использует async.

0 голосов
/ 13 января 2010

Это зависит от движка JavaScript.

...