#javascript #jquery #ajax
После 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; } }
Ответы
Ответ 1
Старый вариант - синхронный код (главный поток будет «заморожен»* до получения результата). Новый вараинт - асинхронный. И функция 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 }); }Ответ 2
Добавьте 2 новых параметра в функцию doesFileExist, например, successCallback и failCallback. Вместо return true/false, выполняйте эти функции: successCallback()/failCallback(). И конечный вызов метода будет примерно такой: doesFileExist(url, function() { // файл существует }, function () { // файл отсуствует });
Комментариев нет:
Отправить комментарий