Каков простой пример асинхронной функции javascript?
Я действительно борется здесь, чтобы справиться с написанием асинхронного JavaScript. Не могли бы вы привести пример простой функции JavaScript, которая является асинхронной, написанной на простом JavaScript (и не используя Node.js или JQuery)
Ответы
Ответ 1
Сам JavaScript является синхронным и однопоточным. Вы не можете написать асинхронную функцию; У простого JS нет API-интерфейса времени. Не будет побочных эффектов от параллельных потоков.
Что вы можете сделать, это использовать некоторые API, предоставленные вашей средой (Node.js, Webbrowser), которые позволяют планировать асинхронные задачи - с использованием тайм-аутов, ajax, FileAPI, requestAnimationFrame
, nextTick
, WebWorkers, DOM события, что угодно.
Пример с использованием setTimeout
(предоставлен HTML Timing API):
window.setTimeout(function() {
console.log("World");
}, 1000);
console.log("Hello");
Обновление. Поскольку ES6 существует promises как асинхронный примитив, встроенный в обычный JavaScript, вы можете сделать
Promise.resolve("World").then(console.log); // then callbacks are always asynchronous
console.log("Hello");
Однако сами по себе они не очень полезны, когда вы не можете ждать (например, таймаут). И они ничего не меняют в отношении модели потоковой передачи, все исполнения выполняются до завершения без каких-либо событий, мешающих на полпути.
Ответ 2
Это асинхронно:
setTimeout(function(){
console.log('1');
}, 2000);
console.log('2');
2 будет записано на консоль до 1. Поскольку setTimeout является асинхронным.
Ответ 3
Вот один очень простой пример:
for (var i = 0; i < 10; i++) {
window.setTimeout(function() {
console.log(i);
}, 2000);
}
Вы можете ожидать, что эти вызовы console.log()
показывают вам 0, 1, 2
и т.д., как в этом фрагменте:
for (var i = 0; i < 10; i++) {
console.log(i);
}
Но на самом деле будет напечатано только 10
! Причина, по которой функции, переданные в функцию setTimeout
(как ее аргумент обратного вызова), будут вызываться после завершения цикла for
, т.е. После i
значение установлено равным 10.
Но вы должны понимать одно: все JavaScript в браузере выполняется в одном потоке; асинхронные события (такие как щелчки мыши и таймеры) выполняются только при открытии очереди выполнения. Здесь блестящая статья, написанная Джоном Ресигом по этой теме.