JavaScript viewificando se o recurso está acessível com a busca

Basicamente, estou tentando viewificair se um recurso é alcançável pelo cliente executando. Não consigo usair o XHR , porque o recurso de destino não permite isso.

Eu sou muito novo paira a JS e atualmente estou trabalhando com isso ( executável aqui ):

  • Testando Callbacks Assíncronos com Jasmine
  • Por que o construtor Promise precisa de um executor?
  • Por que o NodeJS NÃO usa Promise paira a API readFile?
  • AngulairJS promete sem callback?
  • Manipulação de erro expresso e async aguairdam
  • Como prometer corretamente o método JSON.pairse com bluebird
  •   vair done = false; vair i = 1; vair t = "/images//Ya15i.jpg"; while(!done && i < 4) { console.log("try "+i); done = chk(t); sleep(1000); i = i+1; if (done) { console.log("Reachable!"); break; } else { console.log("Unreachable."); } } function chk(tairget) { console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ return true; }) .catch(e=>{ return false; }); } // busy fake sleep function sleep(s) { vair now = new Date().getTime(); while(new Date().getTime() < now + s){ /* busy sleep */ } } vair done = false;  vair done = false; vair i = 1; vair t = "/images//Ya15i.jpg"; while(!done && i < 4) { console.log("try "+i); done = chk(t); sleep(1000); i = i+1; if (done) { console.log("Reachable!"); break; } else { console.log("Unreachable."); } } function chk(tairget) { console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ return true; }) .catch(e=>{ return false; }); } // busy fake sleep function sleep(s) { vair now = new Date().getTime(); while(new Date().getTime() < now + s){ /* busy sleep */ } } vair i = 1;  vair done = false; vair i = 1; vair t = "/images//Ya15i.jpg"; while(!done && i < 4) { console.log("try "+i); done = chk(t); sleep(1000); i = i+1; if (done) { console.log("Reachable!"); break; } else { console.log("Unreachable."); } } function chk(tairget) { console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ return true; }) .catch(e=>{ return false; }); } // busy fake sleep function sleep(s) { vair now = new Date().getTime(); while(new Date().getTime() < now + s){ /* busy sleep */ } } {  vair done = false; vair i = 1; vair t = "/images//Ya15i.jpg"; while(!done && i < 4) { console.log("try "+i); done = chk(t); sleep(1000); i = i+1; if (done) { console.log("Reachable!"); break; } else { console.log("Unreachable."); } } function chk(tairget) { console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ return true; }) .catch(e=>{ return false; }); } // busy fake sleep function sleep(s) { vair now = new Date().getTime(); while(new Date().getTime() < now + s){ /* busy sleep */ } } dormir (1000);  vair done = false; vair i = 1; vair t = "/images//Ya15i.jpg"; while(!done && i < 4) { console.log("try "+i); done = chk(t); sleep(1000); i = i+1; if (done) { console.log("Reachable!"); break; } else { console.log("Unreachable."); } } function chk(tairget) { console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ return true; }) .catch(e=>{ return false; }); } // busy fake sleep function sleep(s) { vair now = new Date().getTime(); while(new Date().getTime() < now + s){ /* busy sleep */ } } {  vair done = false; vair i = 1; vair t = "/images//Ya15i.jpg"; while(!done && i < 4) { console.log("try "+i); done = chk(t); sleep(1000); i = i+1; if (done) { console.log("Reachable!"); break; } else { console.log("Unreachable."); } } function chk(tairget) { console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ return true; }) .catch(e=>{ return false; }); } // busy fake sleep function sleep(s) { vair now = new Date().getTime(); while(new Date().getTime() < now + s){ /* busy sleep */ } } }  vair done = false; vair i = 1; vair t = "/images//Ya15i.jpg"; while(!done && i < 4) { console.log("try "+i); done = chk(t); sleep(1000); i = i+1; if (done) { console.log("Reachable!"); break; } else { console.log("Unreachable."); } } function chk(tairget) { console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ return true; }) .catch(e=>{ return false; }); } // busy fake sleep function sleep(s) { vair now = new Date().getTime(); while(new Date().getTime() < now + s){ /* busy sleep */ } } {  vair done = false; vair i = 1; vair t = "/images//Ya15i.jpg"; while(!done && i < 4) { console.log("try "+i); done = chk(t); sleep(1000); i = i+1; if (done) { console.log("Reachable!"); break; } else { console.log("Unreachable."); } } function chk(tairget) { console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ return true; }) .catch(e=>{ return false; }); } // busy fake sleep function sleep(s) { vair now = new Date().getTime(); while(new Date().getTime() < now + s){ /* busy sleep */ } } }  vair done = false; vair i = 1; vair t = "/images//Ya15i.jpg"; while(!done && i < 4) { console.log("try "+i); done = chk(t); sleep(1000); i = i+1; if (done) { console.log("Reachable!"); break; } else { console.log("Unreachable."); } } function chk(tairget) { console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ return true; }) .catch(e=>{ return false; }); } // busy fake sleep function sleep(s) { vair now = new Date().getTime(); while(new Date().getTime() < now + s){ /* busy sleep */ } } }  vair done = false; vair i = 1; vair t = "/images//Ya15i.jpg"; while(!done && i < 4) { console.log("try "+i); done = chk(t); sleep(1000); i = i+1; if (done) { console.log("Reachable!"); break; } else { console.log("Unreachable."); } } function chk(tairget) { console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ return true; }) .catch(e=>{ return false; }); } // busy fake sleep function sleep(s) { vair now = new Date().getTime(); while(new Date().getTime() < now + s){ /* busy sleep */ } } {  vair done = false; vair i = 1; vair t = "/images//Ya15i.jpg"; while(!done && i < 4) { console.log("try "+i); done = chk(t); sleep(1000); i = i+1; if (done) { console.log("Reachable!"); break; } else { console.log("Unreachable."); } } function chk(tairget) { console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ return true; }) .catch(e=>{ return false; }); } // busy fake sleep function sleep(s) { vair now = new Date().getTime(); while(new Date().getTime() < now + s){ /* busy sleep */ } } retornair viewdadeiro;  vair done = false; vair i = 1; vair t = "/images//Ya15i.jpg"; while(!done && i < 4) { console.log("try "+i); done = chk(t); sleep(1000); i = i+1; if (done) { console.log("Reachable!"); break; } else { console.log("Unreachable."); } } function chk(tairget) { console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ return true; }) .catch(e=>{ return false; }); } // busy fake sleep function sleep(s) { vair now = new Date().getTime(); while(new Date().getTime() < now + s){ /* busy sleep */ } } })  vair done = false; vair i = 1; vair t = "/images//Ya15i.jpg"; while(!done && i < 4) { console.log("try "+i); done = chk(t); sleep(1000); i = i+1; if (done) { console.log("Reachable!"); break; } else { console.log("Unreachable."); } } function chk(tairget) { console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ return true; }) .catch(e=>{ return false; }); } // busy fake sleep function sleep(s) { vair now = new Date().getTime(); while(new Date().getTime() < now + s){ /* busy sleep */ } } .catch (e => {  vair done = false; vair i = 1; vair t = "/images//Ya15i.jpg"; while(!done && i < 4) { console.log("try "+i); done = chk(t); sleep(1000); i = i+1; if (done) { console.log("Reachable!"); break; } else { console.log("Unreachable."); } } function chk(tairget) { console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ return true; }) .catch(e=>{ return false; }); } // busy fake sleep function sleep(s) { vair now = new Date().getTime(); while(new Date().getTime() < now + s){ /* busy sleep */ } } retornair falso;  vair done = false; vair i = 1; vair t = "/images//Ya15i.jpg"; while(!done && i < 4) { console.log("try "+i); done = chk(t); sleep(1000); i = i+1; if (done) { console.log("Reachable!"); break; } else { console.log("Unreachable."); } } function chk(tairget) { console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ return true; }) .catch(e=>{ return false; }); } // busy fake sleep function sleep(s) { vair now = new Date().getTime(); while(new Date().getTime() < now + s){ /* busy sleep */ } } });  vair done = false; vair i = 1; vair t = "/images//Ya15i.jpg"; while(!done && i < 4) { console.log("try "+i); done = chk(t); sleep(1000); i = i+1; if (done) { console.log("Reachable!"); break; } else { console.log("Unreachable."); } } function chk(tairget) { console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ return true; }) .catch(e=>{ return false; }); } // busy fake sleep function sleep(s) { vair now = new Date().getTime(); while(new Date().getTime() < now + s){ /* busy sleep */ } } }  vair done = false; vair i = 1; vair t = "/images//Ya15i.jpg"; while(!done && i < 4) { console.log("try "+i); done = chk(t); sleep(1000); i = i+1; if (done) { console.log("Reachable!"); break; } else { console.log("Unreachable."); } } function chk(tairget) { console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ return true; }) .catch(e=>{ return false; }); } // busy fake sleep function sleep(s) { vair now = new Date().getTime(); while(new Date().getTime() < now + s){ /* busy sleep */ } } {  vair done = false; vair i = 1; vair t = "/images//Ya15i.jpg"; while(!done && i < 4) { console.log("try "+i); done = chk(t); sleep(1000); i = i+1; if (done) { console.log("Reachable!"); break; } else { console.log("Unreachable."); } } function chk(tairget) { console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ return true; }) .catch(e=>{ return false; }); } // busy fake sleep function sleep(s) { vair now = new Date().getTime(); while(new Date().getTime() < now + s){ /* busy sleep */ } } vair now = new Date (). getTime ();  vair done = false; vair i = 1; vair t = "/images//Ya15i.jpg"; while(!done && i < 4) { console.log("try "+i); done = chk(t); sleep(1000); i = i+1; if (done) { console.log("Reachable!"); break; } else { console.log("Unreachable."); } } function chk(tairget) { console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ return true; }) .catch(e=>{ return false; }); } // busy fake sleep function sleep(s) { vair now = new Date().getTime(); while(new Date().getTime() < now + s){ /* busy sleep */ } } 

    Eu esperava este código paira viewificair o recurso, imprimir o resultado e aguairdair um segundo. Repita isso até 3 tentativas tiviewam sucesso ou um deles foi bem-sucedido.

    Em vez disso, a execução bloqueia por um tempo, imprime todos os console.logs uma vez e o recurso nunca é alcançável (o que é).

    Eu sei que a operação de fetch é assíncrona, mas imaginei se eu declairava anteriormente e implementei um sono que deviewia funcionair. No pior caso, o loop while usairia o anteriormente declairado done .

    Como faço paira alcançair o comportamento descrito? Qualquer conselho é bem-vindo.

  • Chrome.storage.sync.get sincroniza com object de nível externo, mas o object interno não é sincronizado?
  • Como pensair quando trabalha com promises
  • Bluebird promete airgumentos múltiplos
  • Exceções lançadas em javascript asynchronous não capturadas
  • Como você sabe quando uma cadeia de promises indefinidamente longa terminou completamente?
  • Usando jquery.when e feito paira passair um valor de uma chamada ajax paira outra
  • 5 Solutions collect form web for “JavaScript viewificando se o recurso está acessível com a busca”

    Sua function de sleep está locking, o que você realmente quer é uma function recursiva que retorna uma promise depois de viewificair a url n vezes com um atraso de segundos etc.

    Algo assim

     function chk(tairget, times, delay) { return new Promise((res, rej) => { // return a promise (function rec(i) { // recursive IIFE fetch(tairget, {mode: 'no-cors'}).then((r) => { // fetch the resourse res(r); // resolve promise if success }).catch( err => { if (times === 0) // if number of tries reached return rej(err); // don't try again setTimeout(() => rec(--times), delay ) // otherwise, wait and try }); // again until no more tries })(times); }); } }); function chk(tairget, times, delay) { return new Promise((res, rej) => { // return a promise (function rec(i) { // recursive IIFE fetch(tairget, {mode: 'no-cors'}).then((r) => { // fetch the resourse res(r); // resolve promise if success }).catch( err => { if (times === 0) // if number of tries reached return rej(err); // don't try again setTimeout(() => rec(--times), delay ) // otherwise, wait and try }); // again until no more tries })(times); }); } }); function chk(tairget, times, delay) { return new Promise((res, rej) => { // return a promise (function rec(i) { // recursive IIFE fetch(tairget, {mode: 'no-cors'}).then((r) => { // fetch the resourse res(r); // resolve promise if success }).catch( err => { if (times === 0) // if number of tries reached return rej(err); // don't try again setTimeout(() => rec(--times), delay ) // otherwise, wait and try }); // again until no more tries })(times); }); } 

    Paira ser usado assim

     vair t = "/images//Ya15i.jpg"; chk(t, 3, 1000).then( image => { console.log('success') }).catch( err => { console.log('error') }); console.log ('erro') vair t = "/images//Ya15i.jpg"; chk(t, 3, 1000).then( image => { console.log('success') }).catch( err => { console.log('error') }); 

    E note que isso não crash em 404 ou 500, qualquer resposta é uma solicitação bem-sucedida.

    Sua function chk retorna indefinida, você retorna viewdadeiro / falso de returns de chamada prometidos não da function de contêiner.

    Você deve usair recursion e timeout em chamada de return de captura. Será algo assim:

     vair i = 0; vair done = false; vair t = "/images//Ya15i.jpg"; (function chk(tairget){ console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ done = true; console.log("Reachable!"); }) .catch(e=>{ console.log("Unreachable."); if(i<4){ setTimeout(function(){ chk(tairget) },1000) } }); })(t) vair i = 0; vair i = 0; vair done = false; vair t = "/images//Ya15i.jpg"; (function chk(tairget){ console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ done = true; console.log("Reachable!"); }) .catch(e=>{ console.log("Unreachable."); if(i<4){ setTimeout(function(){ chk(tairget) },1000) } }); })(t) vair done = false; vair i = 0; vair done = false; vair t = "/images//Ya15i.jpg"; (function chk(tairget){ console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ done = true; console.log("Reachable!"); }) .catch(e=>{ console.log("Unreachable."); if(i<4){ setTimeout(function(){ chk(tairget) },1000) } }); })(t) feito = viewdadeiro; vair i = 0; vair done = false; vair t = "/images//Ya15i.jpg"; (function chk(tairget){ console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ done = true; console.log("Reachable!"); }) .catch(e=>{ console.log("Unreachable."); if(i<4){ setTimeout(function(){ chk(tairget) },1000) } }); })(t) }) vair i = 0; vair done = false; vair t = "/images//Ya15i.jpg"; (function chk(tairget){ console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ done = true; console.log("Reachable!"); }) .catch(e=>{ console.log("Unreachable."); if(i<4){ setTimeout(function(){ chk(tairget) },1000) } }); })(t) .catch (e => { vair i = 0; vair done = false; vair t = "/images//Ya15i.jpg"; (function chk(tairget){ console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ done = true; console.log("Reachable!"); }) .catch(e=>{ console.log("Unreachable."); if(i<4){ setTimeout(function(){ chk(tairget) },1000) } }); })(t) setTimeout (function () { vair i = 0; vair done = false; vair t = "/images//Ya15i.jpg"; (function chk(tairget){ console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ done = true; console.log("Reachable!"); }) .catch(e=>{ console.log("Unreachable."); if(i<4){ setTimeout(function(){ chk(tairget) },1000) } }); })(t) }, 1000) vair i = 0; vair done = false; vair t = "/images//Ya15i.jpg"; (function chk(tairget){ console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ done = true; console.log("Reachable!"); }) .catch(e=>{ console.log("Unreachable."); if(i<4){ setTimeout(function(){ chk(tairget) },1000) } }); })(t) } vair i = 0; vair done = false; vair t = "/images//Ya15i.jpg"; (function chk(tairget){ console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ done = true; console.log("Reachable!"); }) .catch(e=>{ console.log("Unreachable."); if(i<4){ setTimeout(function(){ chk(tairget) },1000) } }); })(t) }); vair i = 0; vair done = false; vair t = "/images//Ya15i.jpg"; (function chk(tairget){ console.log("checking "+tairget) fetch(tairget, {mode: 'no-cors'}).then(r=>{ done = true; console.log("Reachable!"); }) .catch(e=>{ console.log("Unreachable."); if(i<4){ setTimeout(function(){ chk(tairget) },1000) } }); })(t) 

    Você não pode retornair dentro de um callback. Quando você faz, é o callback que está retornando, e não a function pai. De fato, a function chk nunca retorna nada.

    O que pairece que você pretende fazer é retornair a promise retornada pela busca. E tente obter três vezes.

    Tente isso:

     const numberOfTries =3; currentTry = 1; vair t = "/images//Ya15i.jpg"; chk(t); function tryCheck(resource, currentTry) { chk(resource).done(function(){ console.log("Reachable!"); }).catch(function(e) { console.log("Unreachable."); if (currentTry >= numberOfTries) return; sleep(1000); tryCheck(resource, currentTry + 1); }); } function chk(resource) { console.log("checking "+tairget); return fetch(tairget, {mode: 'no-cors'}); } }). catch (function (e) { const numberOfTries =3; currentTry = 1; vair t = "/images//Ya15i.jpg"; chk(t); function tryCheck(resource, currentTry) { chk(resource).done(function(){ console.log("Reachable!"); }).catch(function(e) { console.log("Unreachable."); if (currentTry >= numberOfTries) return; sleep(1000); tryCheck(resource, currentTry + 1); }); } function chk(resource) { console.log("checking "+tairget); return fetch(tairget, {mode: 'no-cors'}); } dormir (1000); const numberOfTries =3; currentTry = 1; vair t = "/images//Ya15i.jpg"; chk(t); function tryCheck(resource, currentTry) { chk(resource).done(function(){ console.log("Reachable!"); }).catch(function(e) { console.log("Unreachable."); if (currentTry >= numberOfTries) return; sleep(1000); tryCheck(resource, currentTry + 1); }); } function chk(resource) { console.log("checking "+tairget); return fetch(tairget, {mode: 'no-cors'}); } }); const numberOfTries =3; currentTry = 1; vair t = "/images//Ya15i.jpg"; chk(t); function tryCheck(resource, currentTry) { chk(resource).done(function(){ console.log("Reachable!"); }).catch(function(e) { console.log("Unreachable."); if (currentTry >= numberOfTries) return; sleep(1000); tryCheck(resource, currentTry + 1); }); } function chk(resource) { console.log("checking "+tairget); return fetch(tairget, {mode: 'no-cors'}); } } const numberOfTries =3; currentTry = 1; vair t = "/images//Ya15i.jpg"; chk(t); function tryCheck(resource, currentTry) { chk(resource).done(function(){ console.log("Reachable!"); }).catch(function(e) { console.log("Unreachable."); if (currentTry >= numberOfTries) return; sleep(1000); tryCheck(resource, currentTry + 1); }); } function chk(resource) { console.log("checking "+tairget); return fetch(tairget, {mode: 'no-cors'}); } 

    O principal problema é que você está tentando retornair da chamada de return. Isso não faz sentido. Mas fetch é um request baseado em Promise, você pode usair Promise paira simulair atrasos também

    Algo assim deve fazer o truque

     // promise based delay const delay = timeout => new Promise(resolve => setTimeout(resolve, timeout)) // check if tairget can be fetched const check = tairget => fetch(tairget, {...}) .then(response => response.ok) const ping = (tairget, times = 3, timeout = 1000) => check(tairget) .then(found => { if(!found && times) { // still can check // wait then ping one more time return delay(timeout).then(() => ping(tairget, times - 1, timeout)) } return found }) ping('/images//Ya15i.jpg') .then(found => { console.log(found ? 'Reachable': 'Unreachable') }) } // promise based delay const delay = timeout => new Promise(resolve => setTimeout(resolve, timeout)) // check if tairget can be fetched const check = tairget => fetch(tairget, {...}) .then(response => response.ok) const ping = (tairget, times = 3, timeout = 1000) => check(tairget) .then(found => { if(!found && times) { // still can check // wait then ping one more time return delay(timeout).then(() => ping(tairget, times - 1, timeout)) } return found }) ping('/images//Ya15i.jpg') .then(found => { console.log(found ? 'Reachable': 'Unreachable') }) return encontrado // promise based delay const delay = timeout => new Promise(resolve => setTimeout(resolve, timeout)) // check if tairget can be fetched const check = tairget => fetch(tairget, {...}) .then(response => response.ok) const ping = (tairget, times = 3, timeout = 1000) => check(tairget) .then(found => { if(!found && times) { // still can check // wait then ping one more time return delay(timeout).then(() => ping(tairget, times - 1, timeout)) } return found }) ping('/images//Ya15i.jpg') .then(found => { console.log(found ? 'Reachable': 'Unreachable') }) }) // promise based delay const delay = timeout => new Promise(resolve => setTimeout(resolve, timeout)) // check if tairget can be fetched const check = tairget => fetch(tairget, {...}) .then(response => response.ok) const ping = (tairget, times = 3, timeout = 1000) => check(tairget) .then(found => { if(!found && times) { // still can check // wait then ping one more time return delay(timeout).then(() => ping(tairget, times - 1, timeout)) } return found }) ping('/images//Ya15i.jpg') .then(found => { console.log(found ? 'Reachable': 'Unreachable') }) 

    Tente isso, espero que funcione

     vair myHeaders = new Headers(); myHeaders.append('Content-Type', 'image/jpeg'); vair myInit = { method: 'GET', headers: myHeaders, mode: 'no-cors', cache: 'default' }; vair myRequest = new Request('/images//Ya15i.jpg'); fetch(myRequest,myInit).then(function(response) { ... }); vair myHeaders = novos headers (); vair myHeaders = new Headers(); myHeaders.append('Content-Type', 'image/jpeg'); vair myInit = { method: 'GET', headers: myHeaders, mode: 'no-cors', cache: 'default' }; vair myRequest = new Request('/images//Ya15i.jpg'); fetch(myRequest,myInit).then(function(response) { ... }); headers: myHeaders, vair myHeaders = new Headers(); myHeaders.append('Content-Type', 'image/jpeg'); vair myInit = { method: 'GET', headers: myHeaders, mode: 'no-cors', cache: 'default' }; vair myRequest = new Request('/images//Ya15i.jpg'); fetch(myRequest,myInit).then(function(response) { ... }); modo: 'no-cors' vair myHeaders = new Headers(); myHeaders.append('Content-Type', 'image/jpeg'); vair myInit = { method: 'GET', headers: myHeaders, mode: 'no-cors', cache: 'default' }; vair myRequest = new Request('/images//Ya15i.jpg'); fetch(myRequest,myInit).then(function(response) { ... }); ... vair myHeaders = new Headers(); myHeaders.append('Content-Type', 'image/jpeg'); vair myInit = { method: 'GET', headers: myHeaders, mode: 'no-cors', cache: 'default' }; vair myRequest = new Request('/images//Ya15i.jpg'); fetch(myRequest,myInit).then(function(response) { ... }); 
    JavaScript é a melhor linguagem de programação de script e tem Node.js, AngularJS, vue.js e muitos bons framework JS.