Я действительно борется здесь, чтобы справиться с написанием асинхронного JavaScript. Не могли бы вы привести пример простой функции JavaScript, которая является асинхронной, написанной на простом JavaScript (и не используя Node.js или JQuery)
Каков простой пример асинхронной функции javascript?
Ответ 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 в браузере выполняется в одном потоке; асинхронные события (такие как щелчки мыши и таймеры) выполняются только при открытии очереди выполнения. Здесь блестящая статья, написанная Джоном Ресигом по этой теме.