2017-11-11 2 views
0

Ich habe 2 URLs. Ich möchte zuerst überprüfen, ob URL1 gültig ist, wenn ja, dann möchte ich URL1 zurückgeben, ansonsten, wenn es nicht gültig ist, möchte ich überprüfen, ob URL2 gültig ist, und wenn dies der Fall ist, URL2 zurückgeben, wenn beide ungültig sind, dann null zurückgeben :Ajax - Überprüfen, ob mehrere URLs gültig sind

if (check(url1)) 
    return url1; 
else if (check(url2)) 
    return url2; 
else return null; 

Wie erreiche ich dies asynchron mit Ajax? Ich habe Schwierigkeiten zu sehen, wie ich die Überprüfung von Url2 auftreten würde, wenn url1 fehlgeschlagen ist. Das ist, was ich bisher habe, aber es ist wahrscheinlich völlig falsch:

function check(url) { 
    $.ajax({type: 'HEAD', url: url, 
    success: function() { return url; }, 
    error: function() { return `${url} not found`; }}); 
} 

async function checkUrl(url1, url2) { 
    try { 
     return await check(url1); 
    } catch (error) { 
     console.log(error); 
     try { 
      return await check(url2); 
     } catch (error) { 
      console.log(error); 
      return null; 
     } 
    } 
} 
+0

wenn es async, die zweite URL Prüfung wird mit der ersten URL zur gleichen Zeit starten. willst du das oder willst du synchronisieren (warte bis der erste fertig ist)? –

+0

Nein, ich möchte nur die 2. URL-Prüfung durchführen, wenn die Überprüfung der ersten URL fehlschlägt. –

Antwort

0

Sie die done und error Ereignisse von .ajax Versprechen $ verwenden und zurückgeben kann ein neues Versprechen:

function getImages(url1, url2){ 
    var dfr = new $.Deferred(); // will hold the promise 
    $.ajax({ 
     type: 'HEAD', 
     url: url1    // first check url1 
    }).done(function(result, status, XHR){ 
     alert('success:'+XHR.status);   // if it succeeds 
     dfr.resolve(url1);  // resolve the promise with url1 
    }).fail(function(){   // if it fails 
     $.ajax({     
      type: 'HEAD', 
      url: url2    // then check url2 
     }).done(function(result, status, XHR){ 
      alert('success:'+XHR.status);  // if it succeeds 
      dfr.resolve(url2); // resolve the promise with url2 
     }).fail(function(){  // if it fails 
      dfr.reject();  // reject the promise 
     }); 
    }); 
    return dfr;     // return the promise to process outside. 
} 

es zu benutzen :

getImages(url1, url2)    // call the method which will return a promise, 
    .done(function(image){   // if it resolves 
    // image will contain the existing image. url1 or url2. 
    img.src = image; 
}).fail(function(){    // if it rejects 
    window.alert("Both images can't be loaded"); 
}); 

weitere Informationen über Latente/Versprechen, können Sie diese Zeilen lesen:

http://api.jquery.com/category/deferred-object/ https://developers.google.com/web/fundamentals/primers/promises https://developer.mozilla.org/tr/docs/Web/JavaScript/Reference/Global_Objects/Promise https://scotch.io/tutorials/javascript-promises-for-dummies

+0

das funktioniert nicht, URLs, von denen ich weiß, dass sie nicht 200 zurückgeben, treffen immer noch das 'done'-Ereignis und nicht das' fail'-Ereignis. –

+0

Sie können ajax Antwort http Status ausfiltern und lösen und ablehnen, welche Fälle Sie wollen. Diese Antwort bietet Ihnen die Verkettung. –

+0

Wie würde ich dann eine 404 zurückweisen? Woher sollte ich diese Informationen bekommen? –

Verwandte Themen