将 XMLHttpRequest() 保存到变量的最佳方法

Best method to save an XMLHttpRequest() to variable

将 XMLHttpRequest 保存到变量以在 if 语句中使用的最佳方法是什么。我正在尝试获取图像大小并根据大小做一些事情。

** *请注意,我使用的是互联网上的随机图片来回答这个问题。我目前正在使用本地服务器进行测试 * **

这是我目前尝试过的方法:

function get_image_size(imgurl) {
  var xhr = new XMLHttpRequest();
  let x
  xhr.open('HEAD', imgurl, true);
  xhr.onreadystatechange = function () {
    if (xhr.readyState == 4) {
      if (xhr.status == 200) {
        x = xhr.getResponseHeader('Content-Length');
        console.log(xhr.getResponseHeader('Content-Length')) // This works! returns bytes
      } else {
        console.log('ERROR');
      }
    }
  };
  xhr.send(null);
  console.log(x) // This doesn't work
  return x // This doesnt return anything
}

let image_size = get_image_size("https://images.ctfassets.net/hrltx12pl8hq/7yQR5uJhwEkRfjwMFJ7bUK/dc52a0913e8ff8b5c276177890eb0129/offset_comp_772626-opt.jpg?fit=fill&w=800&h=300")
// image_size returns "undifined"

我也试过:

function get_filesize(url, callback) {
  var xhr = new XMLHttpRequest();
  xhr.open("HEAD", url, true);
  xhr.onreadystatechange = function() {
      if (this.readyState == this.DONE) {
          callback(parseInt(xhr.getResponseHeader("Content-Length")));
      }
  };
  xhr.send();
}

get_filesize("https://images.ctfassets.net/hrltx12pl8hq/7yQR5uJhwEkRfjwMFJ7bUK/dc52a0913e8ff8b5c276177890eb0129/offset_comp_772626-opt.jpg?fit=fill&w=800&h=300", function(size){image_size = size})

但还是没有运气。

您正在发出异步请求,因此,您不能立即将需要的值分配给 x 以供使用,您的代码需要一种方法来等待请求,然后才能使用或 return x;

一种方法是将 get_image_size 函数包装在 Promise 中,像这样

function get_image_size(imgurl) {
  return new Promise((resolve,  reject) => {
      var xhr = new XMLHttpRequest();
      xhr.open('HEAD', imgurl, true);
      xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
          if (xhr.status == 200) {
            resolve(xhr.getResponseHeader('Content-Length'))
          } else {
            console.log('ERROR');
          }
        }
      };
      xhr.send(null);
  })
}

并像这样使用它

const IMAGE_URL = "https://images.ctfassets.net/hrltx12pl8hq/7yQR5uJhwEkRfjwMFJ7bUK/dc52a0913e8ff8b5c276177890eb0129/offset_comp_772626-opt.jpg?fit=fill&w=800&h=300";

get_image_size(IMAGE_URL).then((size) => {
   console.log(size)
   // YOU CAN ONLY USE SIZE HERE.
   // NOT OUTSIDE OR REASSIGNED
   // COS IT MAY NOT BE AVAILABLE AS THIS IS AN ASYNCHRONOUS OPERATION
})

您只能在链式 .then() 方法的回调中使用 size 的值。

如果您重新分配或尝试从外部访问它,它将工作,因为它可能在您的代码执行时不可用。

另一种方法是使用回调函数,我看到你已经尝试过了,但问题是你是这样重新分配它的image_size = size

您只能在该回调函数中使用它。

所以从技术上讲,您需要将所有需要 image-size 的代码包装在该回调中。