К сожалению, JavaScript не обеспечивает асинхронную функциональность. Работает только в одном потоке. Но большинство современных браузеров предоставляют Worker
s , которые являются вторыми сценариями, которые выполняются в фоновом режиме и могут возвращать результат.
Итак, я пришел к решению, которое, я думаю, полезно асинхронно запускать функцию, которая создает работника для каждого асинхронного вызова.
Приведенный ниже код содержит функцию async
для вызова в фоновом режиме.
Function.prototype.async = function(callback) {
let blob = new Blob([ "self.addEventListener('message', function(e) { self.postMessage({ result: (" + this + ").apply(null, e.data) }); }, false);" ], { type: "text/javascript" });
let worker = new Worker(window.URL.createObjectURL(blob));
worker.addEventListener("message", function(e) {
this(e.data.result);
}.bind(callback), false);
return function() {
this.postMessage(Array.from(arguments));
}.bind(worker);
};
Это пример использования:
(function(x) {
for (let i = 0; i < 999999999; i++) {}
return x * 2;
}).async(function(result) {
alert(result);
})(10);
Это выполняет функцию, которая выполняет итерацию for
с огромным числом, чтобы занять время в качестве демонстрации асинхронности, а затем получает двойное число переданного числа.
Метод async
предоставляет function
, который вызывает требуемую функцию в фоновом режиме, а метод, который предоставляется в качестве параметра async
, вызывает return
в своем уникальном параметре.
Так что в функции обратного вызова я alert
результат.