【问题标题】:TypeError: Object doesn't support property or method 'then' in IE11 in AngularJs appTypeError:对象不支持 AngularJs 应用程序中 IE11 中的属性或方法“then”
【发布时间】:2017-04-10 07:14:38
【问题描述】:

我在 IE 中收到此错误:“TypeError: Object doesn't support property or method 'then'”,在我的 AngularJs 控制器中调用的以下函数中:

GetUserAccessService.checkForValidHashPeriod()
    .then(function (result) {
        if (result === 'false') {
            GetUserAccessService.returnUserHashAuthentication();
        }
    });

这是在我的 AngularJs 服务中调用的 GetUserAccessService.checkForValidHashPeriod 函数:

this.checkForValidHashPeriod = function () {
    var result;
    var now = new Date().getTime();
    if ($sessionStorage.userAuthenticationTokenDate !== null && $sessionStorage.userAuthenticationTokenDate !== undefined) {
        var timeDiff = now - $sessionStorage.userAuthenticationTokenDate;
    }
    if (angular.isUndefined($sessionStorage.userAuthenticationToken) || timeDiff > 1500000) {
        result = false;
    }
    else {
        result = true;
    }
    var stringResult = result.toString();
    return stringResult;
};

使用.then 调用我做错了什么?

【问题讨论】:

  • 您的代码中绝对没有任何内容表明从checkForValidHashPeriod 返回的stringResult 将具有then 方法。据我所知,它只会是字符串值 "true""false"
  • @Phil 感谢您的回复。我想请您澄清一下“您的代码中没有任何内容表明从checkForValidHashPeriod 返回的stringResult 将具有then 方法”是什么意思。我正在学习并希望了解。
  • 你的方法返回一个字符串,而不是一个承诺。字符串没有then方法~developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
  • @Phil 谢谢!天哪,我真希望我几周前就知道了。不是每个人都解释为什么出了问题。你经常因为提出一个有效的问题而被否决。但是,由于有人认为这是一个“愚蠢”的问题(或答案),你就会受到惩罚。无论如何,这就是我们来到 StackOverflow 的原因;学习、成长和给予。

标签: javascript angularjs


【解决方案1】:

下面的函数调用必须更改,因为您的方法将返回一个字符串并且不能在此处使用 'then'

Var someString = GetUserAccessService.checkForValidHashPeriod()
    if (someString === 'false') {
        GetUserAccessService.returnUserHashAuthentication();
    }

【讨论】:

  • 感谢您的帮助和意见:D
【解决方案2】:

如果您打算在 IE 中使用 Promise,您可以尝试使用处理与旧浏览器兼容性的 bluebird lib。

【讨论】:

【解决方案3】:

如果其他人有同样的问题,这里有一个替代答案(也是我最终使用的方法),基于 cmets 和 Phil 的帮助:

this.checkForValidHashPeriod = function () {
    var result = $q.defer();
    var now = new Date().getTime();
    if ($sessionStorage.userAuthenticationTokenDate !== null && $sessionStorage.userAuthenticationTokenDate !== undefined) {
        var timeDiff = now - $sessionStorage.userAuthenticationTokenDate;
    }
    if (angular.isUndefined($sessionStorage.userAuthenticationToken) || timeDiff > 1500000) {
        result.resolve(false);
    }
    else {
        console.log('Hash is valid.')
        result.resolve(true);
    }
    return result.promise;
};

是的,我知道promises$q 的使用可能是不必要的,但我喜欢这种方法,并且与我的其他服务一致。

【讨论】:

  • 你为什么要返回一个承诺?这里根本没有异步任务。
  • @Phil 你能比投反对票更有帮助吗?你一直告诉我我没有做什么,但你没有提供任何真正的洞察力或帮助。诚实地;我是来学习的。
  • 你应该阅读文档来学习,这是一个问答网站。我建议您从Promise 开始,并特别注意末尾的“另请参阅” 部分。简而言之,Promise 有助于克服异步计算的问题。您的代码没有异步计算,因此不需要使用承诺/延迟对象。 accepted answer 是您应该使用问题中的代码做什么的最佳示例
  • @Phil 感谢您的回复。我知道这是一个问答网站,但人们通常会提供洞察力来帮助提出问题的人了解他们的问题。旁边的那个;我将$qpromise 添加到checkForValidHashPeriod 的原因是该服务的异步函数调用(GetUserAccessService.checkForValidHashPeriod),它具有.then 方法。参考我原来的问题。这是错的还是我错过了什么?
  • 这不是特别错误(因为你不会得到错误)但它完全没有必要
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 2020-10-01
  • 2019-03-18
  • 2015-06-17
  • 1970-01-01
相关资源
最近更新 更多