2010-01-13 1 views
5

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

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

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

ли такие методы, как SetTimeout работать одновременно, например

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

...

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

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

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

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

+0

Я не знаю о вызове функции таймаута, пока другой код все еще работает. Вы можете легко ее протестировать. – 2010-01-13 14:31:34

+0

Да, проблема в том, что в моем исходном коде есть много зависимостей, которые мне нужно проверить, прежде чем изменить его так, чтобы реализовать, и я хочу делать все это, только если это стоит того. – Andres

ответ

7

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

Существует nice piece of documentation on timers Джоном Resig (автор очень популярного JQuery Javascript рамочным - если вы новичок в веб-разработки, я хотел бы предложить вам посмотреть его).

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

+0

+1. хотя, хотя верно, что они будут называться серийно, я бы добавил, что использование OP 'webMethod' подразумевает, что то, что он * действительно хочет избежать, синхронно ждет двух разных веб-запросов и этого можно избежать через AJAX. –

+0

@David: мы могли заметить, что в браузере обычно может быть как минимум 2 подключения к исходному серверу, работающему параллельно, что делает AJAX-вызовы эффективным хорошим средством для распараллеливания. – jldupont

+0

Отличная статья .. – Andres

-2

Это зависит от механизма JavaScript.

+0

№. JavaScript является однопоточной во всех браузерах, а ОП спрашивал о запуске JavaScript в браузерах. –

2

Да, именно так веб-запросы через работу 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. 
} }); 
2

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

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

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

0

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

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

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

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