我有一个场景,我要返回一个承诺。
Promise 基本上是由 ajax 请求触发的。
拒绝承诺时,它会显示一个错误对话框,表明服务器存在错误。
我想要做的是,当响应代码为 401 时,我既不想解析承诺,也不想拒绝它(因为它已经显示错误对话框)。我只想重定向到登录页面。
我的代码看起来像这样:
function makeRequest(ur, params) {
return new Promise(function (resolve, reject) {
fetch(url, params).then((response) => {
let status = response.status;
if (status >= 200 && status < 300) {
response.json().then((data) => {
resolve(data);
});
} else {
if (status === 401) {
redirectToLoginPage();
} else {
response.json().then((error) => {
if (!error.message) {
error.message = constants.SERVER_ERROR;
}
reject({ status, error });
});
}
}
});
});
}
如您所见,如果状态为 401,我将重定向到登录页面。这个承诺既没有得到解决,也没有被拒绝。
这段代码可以吗,或者有什么更好的方法来完成这个任务吗?
Promise 只是一个具有 Javascript 属性的对象。它没有什么魔力。因此,未能解决或拒绝承诺就无法将状态从“待处理”更改为其他任何状态。这不会在 Javascript 中造成任何根本问题,因为 Promise 只是一个常规的 Javascript 对象。如果没有代码保留对 Promise 的引用,则 Promise 仍会被垃圾回收(即使仍处于挂起状态)。
这里真正的后果是,如果承诺的状态从未改变,这对承诺的使用者意味着什么?任何.then()
or .catch()
解决或拒绝转换的侦听器永远不会被调用。大多数使用 Promise 的代码都期望它们在未来的某个时刻解决或拒绝(这就是首先使用 Promise 的原因)。如果不这样做,那么该代码通常永远无法完成其工作。
或者如果代码正在使用await
在承诺上而不是.then()
,那么该函数将永远挂起await
。该函数的其余部分将是死代码并且永远不会执行。
您可能有一些其他代码来完成该任务的工作,并且承诺只是被放弃而没有做它的事情。如果你这样做的话,Javascript 中就不存在任何内部问题,但这不是 Promise 的设计工作方式,而且通常也不是 Promise 的使用者期望它们工作的方式。
正如您所看到的,如果状态为 401,我将重定向到登录页面。
Promise 既没有被解决,也没有被拒绝。
这段代码可以吗?或者有没有更好的方法来实现这一点。
在这种特殊情况下,一切都可以,重定向是一种有点特殊和独特的情况。重定向到新的浏览器页面将完全清除当前页面状态(包括所有 JavaScript 状态),因此完全可以通过重定向走捷径,而无需解决其他问题。当新页面开始加载时,系统将完全重新初始化您的 Javascript 状态,因此任何仍待处理的承诺都将被清除。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)