As the AJAX method is asicronous, the return of the verificaExistenciaArquivo
function will occur before AJAX returns.
You can even set the async: false
property of $.ajax
, but this is not recommended, ideally to pass a function from callback
to verificaExistenciaArquivo
.
function verificaExistenciaArquivo(pasta, nomeArquivo, callback) {
var baseUrl = 'http://' + $(location).attr('hostname') + '/monitoramento-mobile/assets/fotos/';
if(pasta == 'assinaturas_entrevista') {
arquivo = baseUrl + 'assinaturas_entrevista/' + nomeArquivo;
}else if (pasta == null) {
arquivo = baseUrl + nomeArquivo;
}
$.ajax({
url: arquivo,
type:'HEAD',
success: function()
{
callback(true);
},
error: function()
{
callback(false);
}
});
}
verificaExistenciaArquivo("nomeDaPasta", "nomeDoArquivo", function (existe) {
console.log(existe ? "Arquivo Existe" : "Arquivo não existe");
});
In this case it is also not interesting to have a global variable to inform the existence of the file, or you delete it as in the example above, or declare it within a closure.
A second problem is that you are downloading the entire file just to see if it exists, ideally it would abort the request as soon as the server responds with readyState: 2 (request recebido)
var uploadFile = document.getElementById("uploadFile");
var linkURL = document.getElementById("linkURL");
var createLink = document.getElementById("createLink");
var destroyLink = document.getElementById("destroyLink");
var linkExists = document.getElementById("linkExists");
// criar um link em memoria para o arquivo selecionado.
createLink.addEventListener("click", function (event) {
if (uploadFile.files.length > 0) {
linkURL.value = URL.createObjectURL(uploadFile.files[0]);
}
});
// destruir o link em memoria para o arquivo selecionado
destroyLink.addEventListener("click", function (event) {
if (linkURL.value) {
URL.revokeObjectURL(linkURL.value);
}
});
// verificar se o link em memoria existe
linkExists.addEventListener("click", function (event) {
if (linkURL.value) {
verificaExistenciaArquivo(linkURL.value, function (exists) {
// exists pode assumir 3 valores:
// true: arquivo encontrado
// false: arquivo não encontrado
// undefined: erro na requisição
console.log(exists);
});
}
});
// verificar se existe algum arquivo no link em memoria.
var verificaExistenciaArquivo = function (url, callback) {
var done = false;
var xmlHttp = new XMLHttpRequest ();
xmlHttp.onreadystatechange = function () {
//readyState 0 a 4:
//0: request não enviado
//1: conexão estabelecida
//2: request recebido
//3: processando request
//4: resposta pronta
var response = { readyState: xmlHttp.readyState, status: xmlHttp.status };
if (!done) {
switch (response.readyState)
{
// 0 antes do 2 - caso o request seja abortado antes da resposta do servidor (timeout).
case 0:
callback(undefined);
break;
//conexão com o servidor bem sucessida, e o mesmo já respondeu com um status.
case 2:
done = true;
xmlHttp.abort();
switch (response.status)
{
case 200: callback(true); break;
case 404: callback(false); break;
default: callback(undefined); break;
}
break;
// 4 antes do 1 - Conexão recusada (possivelmente CORS bloqueado)
case 4:
callback(undefined);
break;
}
}
}
xmlHttp.open("GET", url);
xmlHttp.send();
}
#linkURL {
width: 500px;
}
<div>
<input id="uploadFile" type="file" />
<div>
<input id="createLink" type="button" value="Criar Link" />
<input id="destroyLink" type="button" value="Destruir Link" />
</div>
<div>
<label>
Link Criado:
<input id="linkURL" type="text" disabled />
</label>
</div>
<div>
<input id="linkExists" type="button" value="Verificar Link" />
</div>