Как дождаться выполнения функции?

469
24 ноября 2016, 09:56

После java асинхронность в js это беда для меня. Суть проблемы: написать функцию, которая проверяет наличие файла, если есть, то true, нет - false. Казалось бы все просто, но не тут то было.

Использовал deprecated функцию. И наплодил много кода с ее использованием. Теперь нужно сделать так, чтобы эта же функция работала так же, но была реализована по другому.

Теперь у меня код в if выполняется как false, не дожидаясь верного ответа от doesFileExist(urlToFile); Подскажите пзл, как сюда можно прикрутить ноги? С $.when у меня не получается ничего (

    function doesFileExist(urlToFile) {
           $.ajax({
               url: urlToFile,
               type: 'HEAD',
               error: function () {
                   console.log(false)
                   return false;
               },
               success: function () {
                   console.log(true)
                   return true;
               }
           });
     }
  if(doesFileExist(url)){}

старый вариант

      function doesFileExist(urlToFile){
            var xhr = new XMLHttpRequest();
            xhr.open('HEAD', urlToFile, false);
            xhr.send();
            if (xhr.status == "404") {
                return false;
            } else {
                return true;
            }
        }
Answer 1

Добавьте 2 новых параметра в функцию doesFileExist, например, successCallback и failCallback. Вместо return true/false, выполняйте эти функции: successCallback()/failCallback().

И конечный вызов метода будет примерно такой:

doesFileExist(url, function() {
    // файл существует
}, function () {
    // файл отсуствует
});
Answer 2

Старый вариант - синхронный код (главный поток будет «заморожен»* до получения результата). Новый вараинт - асинхронный. И функция doesFileExist после отправки асин. запроса будет возвращать undefined (так как когда мы ничего не возвращаем (то что в success и error, выполнится позже, после получения ответа), возвращается undefined)

doesFileExist() {
    //async action
    setTimeout(function(){ return true; }, 0)
    // return undefined
}
console.log(doesFileExist());  // undefined

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

var successCallback = function() { console.log(true); }
var errorCallback = function() { console.log(false); }
doesFileExist(url, successCallback, errorCallback);
function doesFileExist(urlToFile, success, error) {
    $.ajax({
        url: urlToFile,
        error: error,
        success: success
    });
}
READ ALSO
как json вывести строку J в html

как json вывести строку J в html

как в json вывести строку J в html.

534
Jquery ui resizable

Jquery ui resizable

Возможно ли поменять свойства блока в jquery-ui. css.

377
Как подключить jquery вместе с React js?

Как подключить jquery вместе с React js?

Установил я через npm jquery.

1932
Форма связи JQUERY AJAX

Форма связи JQUERY AJAX

Есть скрипт для отправки формы, подскажите, как вместо алерта вывести скрытый див с благодарностями?.

438