Я пишу Javascript Promise
, который находит окончательный URL-адрес переадресации ссылки.
Я делаю запрос HEAD
в Promise
с помощью XMLHttpRequest
. Затем, при загрузке, проверьте статус HTTP для чего-то в диапазоне 300 или если у него есть responseURL
, прикрепленный к объекту, и этот URL-адрес отличается от того, что он был одним.
Если ни одно из них не верно, я resolve(url)
. В противном случае я рекурсивно вызываю getRedirectUrl()
по URL-адресу ответа и resolve()
.
Здесь мой код:
function getRedirectUrl(url, maxRedirects) {
maxRedirects = maxRedirects || 0;
if (maxRedirects > 10) {
throw new Error("Redirected too many times.");
}
var xhr = new XMLHttpRequest();
var p = new Promise(function (resolve) {
xhr.onload = function () {
var redirectsTo;
if (this.status < 400 && this.status >= 300) {
redirectsTo = this.getResponseHeader("Location");
} else if (this.responseURL && this.responseURL != url) {
redirectsTo = this.responseURL;
}
if (redirectsTo) {
// check that redirect address doesn't redirect again
// **problem line**
p.then(function () { self.getRedirectUrl(redirectsTo, maxRedirects + 1); });
resolve();
} else {
resolve(url);
}
}
xhr.open('HEAD', url, true);
xhr.send();
});
return p;
}
Затем, чтобы использовать эту функцию, я делаю что-то вроде:
getRedirectUrl(myUrl).then(function (url) { ... });
Проблема в том, что resolve();
в getRedirectUrl
вызовет then()
из вызывающей функции до того, как он вызовет рекурсивный вызов getRedirectUrl
, и в этот момент URL-адрес undefined
.
Я пытался, а не p.then(...getRedirectUrl...)
делать return self.getRedirectUrl(...)
, но это никогда не будет разрешено.
Моя догадка заключается в том, что шаблон, который я использую (который я в основном придумал на лету), не прав, вообще.