2014-09-21 1 views
-1

Асинхронная функция означает отсутствие блокировки, и в основном она поддерживает функцию обратного вызова. В C# и java при вызове функции асинхронно должно быть задействовано несколько потоков. Таким образом, потоки выполняют работу параллельно, и функция обратного вызова вызывается, когда асинхронный метод завершен.Асинхронная функция означает отсутствие блокировки, как насчет в javascript?

Язык как javascript - это одна тема. Итак, как доза реализует асинхронную функцию?

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

Не понимаю ли я что-то?

+0

Асинхронные вызовы в Java и C# не обязательно (обязательно) означают, что задействован другой поток, только что вызов устанавливает способ продолжения (часто функцию обратного вызова) и возвращает как можно скорее другую работу, в то время как (например, чтение диска) завершается. –

ответ

1

@Joachim Isaksson: мы с вами согласны, что асинхронный вызов не блокирует, но в javascript асинхронный вызов с использованием функции setTimeout просто задерживает блокировку, он никогда не удаляет блокировку.

function f1(callback){ 
    setTimeout(function() { 
      // f1's logic 
      callback(); 
    }, 1000); 
  } 

    f1(f2); 

Как коды, логика f1 будет задержка и когда f1 закончена, он будет обратный вызов на f2. Он выглядит как асинхронный. Но это просто задерживает блокировку.

+0

Нет * блокировки с задержкой *, потому что обратный вызов не прерывает текущий код. См. Мой ответ. –

3

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

console.log("before async call"); 
setTimeout(function() { console.log("async stuff done"); }, 0); 
console.log("after async call"); 

Это будет всегда дисплей

before async call 
after async call 
async stuff done 

Но теперь, если вы:

console.log("before async call"); 
setTimeout(function() { console.log("async stuff done"); }, 0); 
console.log("after async call"); 
while (true) { 
    // Do nothing 
} 

Это будет просто дисплей:

before async call 
after async call 

async stuff done никогда не отображается, потому что while (true) блокирует выполнение.

+0

Я согласен с тем, что вы сказали в основном. Но я рассматриваю функцию setTimeout как блок, поэтому в C# или java этот блок может работать в другом потоке параллельно. Но в javascript этот блок по-прежнему работает в одном потоке (все мы знаем, что эта функция добавлена ​​в очередь событий), мы не уверены в том, какое именно время оно выполняется, но мы уверены, что он будет запущен в какой-то момент. Поэтому я думаю, что блок задерживается. –

Смежные вопросы