2013-08-10 4 views
0

Я новичок в JavaScript и из различных ресурсов, которые я прочитал, что функции JavaScript являются асинхронными, если они связаны с Callbacks. После тщательного поиска в течение 10 дней в Интернете я не смог найти объяснение того, как Callbacks в JavaScript запускается асинхронно. Некоторые примеры с AJAX приведены, но они не дают четкого ответа, может ли кто-нибудь объяснить, как обратные вызовы в JavaScript выполняются асинхронно для приведенного ниже кода?Асинхронный JavaScript с использованием обратных вызовов

function myFunc(a,b,callback){ 
    var callbackValue = callback(); 
    var add= a+b; 
    var subt= a-b; 
    var mult= a*b; 
    var div= a/b; 
    ... 
    ... 
    ... 
    ... 
    ... 
    var totalValue= add+callbackValue; 
} 

function myFunc(a,b,function(){//complex scientific operation which takes 10 secs }); 

Как я использую функцию обратного вызова в «MyFunc» в приведенном выше коде, это значит, что, когда обратного вызова() вызывается в «MyFunc», он работает в асинхронном режиме и выполнение программы продолжается с вар оных = а + Ь; var subt = a-b; ......... ....... не дожидаясь результата обратного вызова() ;?

+6

Нет, просто передача функций в качестве аргумента не делает ничего асинхронным. Асинхронными вещами в JavaScript являются такие вещи, как 'setTimeout',' setInterval', обработчики событий, веб-рабочие и т. Д. Так что в зависимости от того, что делает обратный вызов, когда вы говорите «который занимает 10 секунд», если он не использует асинхронный функция, это не асинхронно. – Ian

+1

Пример асинхронного обратного вызова: http://jsfiddle.net/92yxc/. Причина, по которой необходим обратный вызов, заключается в том, что анонимная функция, запускаемая 'setTimeout', должна запускаться 1000 мс с момента выполнения« setTimeout ». Поэтому функция 'test' не может вернуть требуемое значение, и вместо этого вы должны использовать обратный вызов, чтобы обратный вызов имел доступ к значению, когда он доступен (от 1000 мс от) – Ian

+1

@Ian: Я думаю, вы должны сделать это ответ. –

ответ

0

Да и нет. Если вы не используете setTimeout/setInterval, он запускается синхронно.

// alert after 5 seconds 
function func(f) { 
    f(); 
    alert('Hello'); 
} 

func(wait5); 

Но если вы используете setTimeout, он может запускаться в отдельном контексте выполнения. Я бы это сделал Google, потому что это риторическое объяснение.

// alert immediately, then wait 5 seconds 
function func(f) { 
    setTimeout(f, 0); 
    alert('Hello'); 
} 

func(wait5); 

Конечно, wait5 в этом случае будет функцией, которая ждет 5 секунд. Вы можете создать эту функцию, если хотите, просто запустите цикл while до истечения 5 секунд (проверьте с помощью new Date().getTime())

0

асинхронный - не происходит в то же время.

синхронный означает, что странице придется ждать, пока выполняется JavaScript. С асинхронной страницей не нужно ждать выполнения jaJavaScript