Дождитесь завершения функции JavaScript, прежде чем продолжить

Возможно, это не сложный вопрос, но я не уверен, что я на правильном пути.

Моя цель - сначала запустить функцию JavaScript, а когда выполнение будет полностью завершено (это может занять несколько секунд, но не всегда), закрыть окно.

Функция и закрытие запускаются всего 1 кнопкой:

<button id = "myID">Click me</button>

Код JavaScript:

<script type = "text/javascript">
    function someFunction() {
        // do some stuff
    }

    document.getElementById('myID').addEventListener("click", function(){
        someFunction();
        window.close();
    });
</script>

Это отлично работает, но может ли кто-нибудь дать совет, является ли это надежным методом или нет? Важно, чтобы выполнение функции было полностью завершено до запуска window.close ().

Я полагаю, вы не на самом деле выполняете alert в этой функции? Но скорее какой-то [асинхронный] ввод-вывод (запрос ajax или еще много чего)?

Sergio Tulentsev 23.09.2018 21:44

Если в someFunction нет кода, ожидающего асинхронных результатов, таких как запрос ajax, и вы хотите, чтобы они завершились до закрытия окна, тогда да, остальная часть кода гарантированно выполнится после него.

Jeto 23.09.2018 21:45

OP, если вы объясните, что функция на самом деле делает, это а) избавит всех от догадок и б) вы получите лучший ответ.

Andy 23.09.2018 21:52

@Andy someFunction () выполняет некоторые манипуляции с DOM после загрузки страницы. Время выполнения действительно зависит от браузера, скорости процессора и т. д. Здесь нет AJAX.

elton73 23.09.2018 22:12

@ elton73 В этом случае вам нужно спросить себя, делаете ли вы что-нибудь асинхронно или нет. Манипуляции с DOM синхронны.

vicbyte 23.09.2018 22:14

@vicbyte Синхронный тогда. Мой код здесь должен быть в порядке?

elton73 23.09.2018 22:17
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
264
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Синхронный javascript всегда будет запускаться в порядке сверху вниз и всегда гарантирует, что первая инструкция будет завершена раньше, чем вторая.

Но есть также асинхронная часть (у вас ее здесь нет, но, например, запросы ajax часто асинхронны), которая выполняется по-другому и требует обратные вызовы / обещания.

Ответ принят как подходящий

Вы можете положить window.close() прямо под alert();. Однако, если вы хотите добавить больше асинхронных элементов, вам нужна функция обратного вызова, подобная этой.

<script type = "text/javascript">
    var closeWindow = function() {
        window.close();
    };

    function someFunction(callback) {
        alert('hi');
        callback();
    }

    document.getElementById('myID').addEventListener("click", function(){
        someFunction(closeWindow);
    });
</script>

Зачем ему нужен обратный вызов, если он выполняет только синхронные операции?

vicbyte 23.09.2018 21:47

Разве не безопаснее использовать функцию обратного вызова, если он хочет добавить асинхронные материалы?

Jonathan Gagne 23.09.2018 21:50

Нет, OP здесь не требует обратного вызова.

Jonas Wilms 23.09.2018 22:19

В качестве примечания: вместо var closeWindow = function() {} вы должны написать function closeWindow() {}, здесь нет необходимости или преимуществ использования выражения присваивания. Использование выражения указывает на то, что переменной closeWindow может быть назначена другая функция позже или в другом месте.

t.niese 23.09.2018 22:37

Правда, однако, я почти поставил () => {}, и мне нравится заставлять их учиться подобию в кодировании.

Jonathan Gagne 23.09.2018 22:39

Использование стрелочной функции только потому, что она нова и короче для написания, вместо ее функций тоже нехорошо. А var closeWindow = () => {} не лучше. Можно спорить о преимуществах const closeWindow =. Мне лично это не нравится, но я вижу в этом преимущества, но назначение var или let для чего-то, что не меняется, - это то, чего вы не должны делать.

t.niese 23.09.2018 22:53

Возможны следующие варианты:

  1. поместите window.close(); в функцию обратного вызова
  2. используйте обещания таким образом, вы можете контролировать выполнение обратного вызова / если есть ошибка, вы можете лучше справиться с ней и не закрывать окно /

someFunction() does some DOM manipulation after a page has loaded

Это синхронно (браузер может отложить рендеринг, но здесь речь идет о миллисекундах), и поэтому гарантируется, что манипуляции с DOM будут выполнены до возврата из функции.

Другие вопросы по теме