【发布时间】:2015-05-15 06:08:10
【问题描述】:
我正在编写一个 Javascript Promise 来查找链接的最终重定向 URL。
我正在做的是使用XMLHttpRequest 在Promise 中发出HEAD 请求。然后,在加载时,检查 300 范围内的某些内容的 HTTP 状态,或者它是否有一个 responseURL 附加到对象并且该 url 与单手操作不同。
如果这些都不是真的,我resolve(url)。否则,我会在响应 URL 上递归调用 getRedirectUrl() 和 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) { ... });
问题是getRedirectUrl中的resolve();会在调用getRedirectUrl递归调用之前从调用函数调用then(),此时,URL是undefined。
我试过了,而不是 p.then(...getRedirectUrl...) 做 return self.getRedirectUrl(...) 但这永远不会解决。
我的猜测是我正在使用的模式(我基本上是即时想出的)完全不正确。
【问题讨论】:
-
p.then(...)的功能不会产生任何可观察到的副作用,returns 没有任何意义。 -
作为一般规则,尽量避免在 Promise 构造函数中做太多工作。这很少是您想要的,并且通过
then()和多个函数的常规链,问题变得更加清晰。
标签: javascript recursion promise