Как вы, возможно, знаете, среда исполнения языка JavaScript является «единственным потоком».
Так называемый «единственный поток» означает, что одна задача может быть выполнена только за раз. Если есть несколько задач, вы должны встать в очередь, выполнить предыдущую задачу, выполнить следующую задачу и так далее.
Преимущество этой модели состоит в том, что ее относительно просто в реализации, а среда выполнения относительно проста; выполнение всей программы. Общие браузеры не отвечают (фальшивая смерть) часто потому, что определенная часть кода JavaScript работает в течение длительного времени (например, мертвая петля), что приводит к застенчивому в этом месте всю страницу, и другие задачи не могут быть выполнены.
Чтобы решить эту проблему, язык JavaScript делит режим выполнения задач на два типа: синхронные (синхронные) и асинхронные (асинхронные).
«Синхронный режим» - это режим предыдущего раздела, а последняя задача ждет, пока предыдущая задача закончится, а затем выполняет его Совершенно иначе, и каждая задача имеет одну или несколько функций обратного вызова (обратные вызовы). В конце концов, порядок выполнения программы и задача.
«Асинхронный режим» очень важен. Со стороны браузера долгосрочные операции должны быть выполнены асинхронно, чтобы избежать браузера потери ответа. На стороне сервера «асинхронный режим» является даже единственным режимом, поскольку среда выполнения однопоточена, если все HTTP-запросы будут выполнены синхронно, производительность сервера резко упадет и скоро потеряет свой ответ.
1. Функция обратного вызова
Это самый основной метод асинхронного программирования.
Предположим, что есть две функции F1 и F2, последние ожидают результата выполнения первого.
Кода -копия выглядит следующим образом:
f1 ();
f2 ();
Если F1 является трудоемкой задачей, вы можете рассмотреть возможность переписывания F1 и написания F2 в качестве функции обратного вызова F1.
Кода -копия выглядит следующим образом:
Функция F1 (обратный вызов) {
settimeout (function () {
// код задачи F1
перезвонить();
}, 1000);
}
Код выполнения становится таким:
F1 (F2);
Преимущество функций обратного вызова состоит в том, что они просты, легко понять и развернуть, и недостаток заключается в том, что они не способствуют чтению и обслуживанию кода. Будьте очень хаотичны, и каждая задача может указать только одну функцию обратного вызова.
2. Мониторинг событий
Другая идея-принять модель, управляемую событиями. Выполнение задачи зависит не от порядка кода, а от того, происходит ли событие.
Давайте возьмем F1 и F2 в качестве примеров. Во -первых, свяжите событие для F1 (метод написания jQuery, используемый здесь).
Кода -копия выглядит следующим образом:
f1.on ('Dode', F2);
Вышеуказанная строка кода означает, что когда выполняется событие в F1, F2 выполняется. Затем перепишите F1:
Кода -копия выглядит следующим образом:
функция f1 () {
settimeout (function () {
// код задачи F1
f1.trigger ('dode');
}, 1000);
}
f1.trigger ('dode') означает, что после завершения выполнения событие выполнено сразу же запускается, тем самым начинает выполнять F2.
Преимущество этого метода состоит в том, что он относительно легко понять. Недостатком является то, что вся программа станет управляемой событиями, и процесс работы станет очень неясным.
3. Публикуйте/подпишитесь
«Событие» в предыдущем разделе может быть полностью понято как «сигнал».
Мы предполагаем, что есть «Сигнальный центр». Это называется «шаблон публикации-подписки», также известный как «шаблон наблюдателя».
Есть много реализаций этой модели.
Во -первых, F2 подписывается на сигнал «выполнен» на «Сигнальный центр» jQuery.
Кода -копия выглядит следующим образом:
jquery.subscribe ("Dode", F2);
Затем F1 переписан следующим образом:
Кода -копия выглядит следующим образом:
функция f1 () {
settimeout (function () {
// код задачи F1
jquery.publish ("Dode");
}, 1000);
}
jquery.publish («dode») означает, что после завершения F1 выполнение «сделано» сигнал выпускается в jQuery «Сигнал», тем самым вызывая выполнение F2.
Кроме того, после выполнения F2 отписать также отписаться от подписки.
Кода -копия выглядит следующим образом:
jquery.unsubscribe ("Dode", F2);
Природа этого подхода похож на «слушание событий», но значительно лучше, чем последний. Потому что мы можем отслеживать работу программы, просмотрев «Центр сообщений», чтобы понять, сколько сигналов существует и сколько подписчиков для каждого сигнала.
4. обещает объект
Объект обещаний - это спецификация, предложенная рабочей группой CommonJS, с целью предоставления единого интерфейса для асинхронного программирования.
Проще говоря, его идея состоит в том, что каждая асинхронная задача возвращает объект обещания, который имеет метод, который позволяет указать функцию обратного вызова. Например, функция обратного вызова F2 F1 может быть написана как:
Кода -копия выглядит следующим образом:
f1 (). Тогда (F2);
F1 должен быть переписан следующим образом (здесь используется реализация jQuery):
Кода -копия выглядит следующим образом:
Функция f1 () {
var dfd = $ .deferred ();
settimeout (function () {
// код задачи F1
dfd.resolve ();
}, 500);
возврат dfd.promise;
}
Преимущество написания таким образом состоит в том, что функция обратного вызова стала методом записи цепочки, и программный поток можно увидеть очень четко, и существует полный набор методов поддержки, которые могут реализовать много мощных функций.
Например, укажите несколько функций обратного вызова:
f1 (). Тогда (F2) .Then (F3);
Например, укажите функцию обратного вызова, когда возникает ошибка:
f1 (). Тогда (f2) .fail (f3);
Более того, у него есть преимущество, что ни один из предыдущих трех методов не имеет: если задача была выполнена, добавьте функцию обратного вызова, и функция обратного вызова будет выполнена немедленно. Таким образом, вам не нужно беспокоиться о том, чтобы пропустить событие или сигнал. Недостатком этого метода является то, что относительно сложно написать и понять.