如果您不解决或拒绝承诺会怎样?

2023-12-21

我有一个场景,我要返回一个承诺。 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(使用前将#替换为@)

如果您不解决或拒绝承诺会怎样? 的相关文章

随机推荐