Javascript Safari ITP 2.0存储访问API-在hasStorageAccess中嵌套requestStorageAccess时出现问题-非嵌套工作

Javascript Safari ITP 2.0存储访问API-在hasStorageAccess中嵌套requestStorageAccess时出现问题-非嵌套工作,javascript,cookies,iframe,safari,storage-access-api,Javascript,Cookies,Iframe,Safari,Storage Access Api,我目前正在尝试实现调用存储访问API,但在将对requestStorageAccess的调用嵌套到hasStorageAccess中时遇到问题 下面是代码的概要——它相当标准: requestStorageAccessAndServe() { let thisObject = this; var promise = document.hasStorageAccess(); promise.then( function (hasCookieAcces

我目前正在尝试实现调用存储访问API,但在将对requestStorageAccess的调用嵌套到hasStorageAccess中时遇到问题

下面是代码的概要——它相当标准:

  requestStorageAccessAndServe() {
    let thisObject = this;
    var promise = document.hasStorageAccess();
      promise.then(
        function (hasCookieAccess) {
          if (!hasCookieAccess) {
            document.requestStorageAccess().then(
                function successful() {
                  // reload iframe to run with cookie access
                  window.location.reload();
                },
                function fail() {
                  thisObject.serveContent();  // Code goes into here
                });
          } else {
            thisObject.serveContent();
          }
        },
        function (reason) {
          thisObject.serveContent();
        }
      );

  }
当点击按钮触发此方法时,我总是陷入“失败”功能,没有出现请求存储访问的提示

令人惊讶的是,这种非嵌套代码工作得非常完美:

  requestStorageAccessAndServe() {
    let thisObject = this;
    let hasCookieAccess = !!document.cookie;
    if (!hasCookieAccess) {
      document.requestStorageAccess().then(
          function successful() {
            window.location.reload();
          },
          function fail() {
            thisObject.serveContent();
      });

    } else {
      thisObject.serveContent();
    }
  }
这段代码可以工作-它在第一个请求中重新加载iframe,然后在另一个请求重新加载后提供数据,但是通过执行来检查cookie访问!!cookie非常粗糙(如果首先没有cookie数据该怎么办),我更想了解这里出了什么问题。有人知道吗

对于可能的解决方案,是否有任何方法可以强制解析document.hasStorageAccess(),这样就不需要嵌套它

编辑:

强迫承诺解决也无济于事。请参见代码示例:

  async requestStorageAccessAndServe() {
    let thisObject = this;
    let hasCookieAccess = await document.hasStorageAccess();
    if (!hasCookieAccess) {
      document.requestStorageAccess().then(
          function successful() {
            window.location.reload();
          },
          function fail() {
            thisObject.serveContent();
      });

    } else {
      thisObject.serveContent();
    }
  }

仍然使用“fail”函数…

这里的问题是requestStorageAccess()需要调用用户意图。通过将其嵌套在hasStorageAccess()承诺中,用户意图(单击)被模糊,Safari自动拒绝请求


为了解决这个问题,我在iframe加载上解析hasStorageAccess(因为它不需要用户意图),将这个结果存储在一个类变量中,然后如果解析为false,我在单击时检查requestStorageAccess

这个还能用吗?如果我调用hasStorageRequest(),如果我以前授予它,我会得到一个真值。但是,我仍然无法访问cookies。仅在用户操作中运行requestStorageAccess()之后。您可以发送一些代码示例或显示在线示例吗?我也会评估您的任何代码示例,因为我在按下按钮时调用了requestStorageAccess,但它仍然不允许存储cookie。很抱歉,这是我两年前所在的一家公司,没有访问任何代码来生成示例。只需确保您对requestStorageAccess的调用是在单击按钮时直接调用的,而不是在hasStorageAccess承诺的解决方案内。