Проверьте этот код :
<a href="#" id="link">Link</a>
<span>Moving</span>
$('#link').click(function () {
console.log("Enter");
$('#link').animate({ width: 200 }, 2000, function() {
console.log("finished");
});
console.log("Exit");
});
Как вы можете видеть в консоли, функция «animate» является асинхронной и «разветвляет» поток кода блока обработчика событий. По факту :
$('#link').click(function () {
console.log("Enter");
asyncFunct();
console.log("Exit");
});
function asyncFunct() {
console.log("finished");
}
следить за потоком кода блока!
Если я хочу создать свой function asyncFunct() { }
с этим поведением, как я могу сделать это с помощью javascript / jquery? Я думаю , что есть стратегия без использования setTimeout()
javascript
jquery
function
asynchronous
markzzz
источник
источник
Ответы:
Вы не можете создать действительно пользовательскую асинхронную функцию. В конечном итоге вам придется использовать технологии, предоставляемые изначально, такие как:
setInterval
setTimeout
requestAnimationFrame
XMLHttpRequest
WebSocket
Worker
onload
На самом деле для анимации использует jQuery
setInterval
.источник
setInterval
), но мы не можем даже открыть его, чтобы увидеть, как это делается. У вас есть больше информации по этому вопросу?setImmediate
promises
. Это даетawaitable
?Вы можете использовать таймер:
(где
yourFn
ссылка на вашу функцию)или с Лодашем :
источник
setTimeout
составляет 4 миллисекунды по спецификации HTML5. Задание 0 все равно займет это минимальное количество времени. Но да, он хорошо работает в качестве функции отложенного вызова.здесь у вас есть простое решение (другие пишут об этом) http://www.benlesh.com/2012/05/calling-javascript-function.html
И вот у вас есть выше готовое решение:
ТЕСТ 1 ( может выводить «1 x 2 3» или «1 2 x 3» или «1 2 3 x» ):
ТЕСТ 2 ( всегда будет выводить 'x 1' ):
Эта функция выполняется с таймаутом 0 - она будет имитировать асинхронную задачу
источник
console.log(1)
вызывается и output (undefined
) передается в качестве 2-го аргументаasync()
. В случае TEST 1, я думаю, вы не до конца понимаете очередь выполнения JavaScript. Поскольку каждый из вызововconsole.log()
происходит в одном стеке,x
он гарантированно записывается последним. Я бы отклонил этот ответ за дезинформацию, но мне не хватило бы репутации.async(function() {console.log('x')}, function(){console.log(1)});
.TEST 2 as: async(function() {console.log('x')}, function(){console.log(1)});
- я уже исправил этоВот функция, которая принимает другую функцию и выводит версию, которая работает асинхронно.
Он используется как простой способ сделать асинхронную функцию:
Это отличается от ответа @ fider, поскольку сама функция имеет свою собственную структуру (обратный вызов не добавлен, она уже есть в функции), а также потому, что она создает новую функцию, которую можно использовать.
источник
(function(a){ asyncFunction(a); })(a)
setTimeout(asyncFunction, 0, a);
Редактировать: я совершенно не понял вопрос. В браузере я бы использовал
setTimeout
. Если бы было важно, чтобы он запускался в другом потоке, я бы использовал Web Workers .источник
Поздно, но покажу простое решение, использующее
promises
после их введения в ES6 , оно намного проще обрабатывает асинхронные вызовы:Вы устанавливаете асинхронный код в новом обещании:
Примечание для установки
resolve()
после завершения асинхронного вызова.Затем вы добавляете код, который хотите запустить после завершения асинхронного вызова, внутри
.then()
обещания:Вот фрагмент этого:
или JSFiddle
источник
На этой странице вы познакомитесь с основами создания асинхронной функции JavaScript.
Начиная с ES2017, асинхронные функции javacript намного легче писать. Вы также должны прочитать больше об обещаниях .
источник
Если вы хотите использовать параметры и регулировать максимальное количество асинхронных функций, вы можете использовать простой асинхронный рабочий, который я построил:
Вы можете использовать это так:
источник
Хотя это решение принципиально не отличается от других решений, я думаю, что мое решение делает несколько дополнительных приятных вещей:
Function.prototype
разрешению более хорошего способа назвать этоТакже сходство со встроенной функцией
Function.prototype.apply
мне кажется уместным.источник
Рядом с отличным ответом @pimvdb, и на тот случай, если вам интересно, async.js также не предлагает действительно асинхронных функций. Вот (очень) урезанная версия основного метода библиотеки:
Таким образом, функция защищает от ошибок и изящно передает ее обратному вызову для обработки, но код такой же синхронный, как и любая другая функция JS.
источник
К сожалению, JavaScript не обеспечивает асинхронную функциональность. Работает только в одном потоке. Но большинство современных браузеров предоставляют
Worker
S , то есть вторые сценарии, которые выполняются в фоновом режиме и могут возвращать результат. Итак, я нашел решение, которое, я думаю, полезно асинхронно запускать функцию, которая создает рабочий для каждого асинхронного вызова.Код ниже содержит функцию
async
для вызова в фоновом режиме.Это пример для использования:
Это выполняет функцию, которая выполняет итерацию
for
с огромным числом, чтобы занять время в качестве демонстрации асинхронности, а затем получает двойное число переданного числа.async
Способ обеспечивает ,function
который вызывает желаемое функцию в фоновом режиме, так и в той , которая указана в качестве параметраasync
функции обратного вызова отreturn
в его единственном параметре. Так что в функции обратного вызова яalert
результат.источник
У MDN хороший пример использования setTimeout с сохранением «this».
Как следующее:
источник