首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >返回$http调用后的.then似乎没有正确返回

返回$http调用后的.then似乎没有正确返回
EN

Stack Overflow用户
提问于 2015-09-23 17:20:10
回答 2查看 17关注 0票数 1

我有一个调用函数的代码,在这个代码中,我返回了一个调用$http的函数。当代码运行时,我不明白为什么我看到

发出"notok“的警报,然后是"topicsRetrieve2 okay”的警报。

如果topicsRetrieve2失败了,$http不应该返回一个失败的承诺吗?

代码语言:javascript
运行
复制
topicsRetrieve = (): any => {
    this.topicsRetrieve2().then(() => {
        alert("topicsRetrieve2 okay");
    }, () => {
        alert("topicsRetrieve2 failed");
    })
}

topicsRetrieve2 = (): ng.IPromise<any> => {
    return this.$http({
        method: "GET",
        url: "badurlxxxxxxxx"
    })
        .then(() => {
            alert("ok");
        }, () => {
            alert("notok");
        })

AngularJS v1.4.1

更新:新的潜在解决方案:

代码语言:javascript
运行
复制
topicsRetrieve2 = (): ng.IPromise<any> => {
    var defer = this.$q.defer();
    this.$http({
        method: "GET",
        url: "badurlxxxxxxxx"
    })
        .then(() => {
            alert("ok");
            defer.resolve();
        }, () => {
            alert("notok");
            defer.reject()
        })
     return defer.promise;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-23 17:25:27

这是用简单的话说出来的。

  1. 请求失败,出现某些错误状态。
  2. 您将陷入获取alert("notok")的错误回调。
  3. 由于您没有从"notok"-callback返回新的被拒绝的承诺或抛出新的错误,这实际上意味着您从异常情况中恢复过来.
  4. ..。自从你康复以后,你就成功地回到了承诺链上。

因此,如果您提供了一个中间错误回调("notok“),请确保为链中的后续处理程序返回新的被拒绝的承诺:

代码语言:javascript
运行
复制
topicsRetrieve2 = (): ng.IPromise<any> => {
    return this.$http({
        method: "GET",
        url: "badurlxxxxxxxx"
    })
    .then(() => {
        alert("ok");
    }, () => {
        alert("notok");
        throw new Error("notok");
    })
}
票数 1
EN

Stack Overflow用户

发布于 2015-09-23 17:25:14

你的代码有点奇怪,你想做什么?

你是在回报承诺的结果,而不是承诺本身。在topicsRetrieve2中,你想要的只是

代码语言:javascript
运行
复制
return this.$http.get('badurlxxxx');

没有.then在topicsRetrieve2内。这样,它将返回承诺,而您在topicsRetrieve中的topicsRetrieve将在成功/失败时执行

代码语言:javascript
运行
复制
topicsRetrieve = (): any => {
    this.topicsRetrieve2().then(() => {
        alert("topicsRetrieve2 okay");
    }, () => {
        alert("topicsRetrieve2 failed");
    })
}

topicsRetrieve2 = (): ng.IPromise<any> => {
    return this.$http({
        method: "GET",
        url: "badurlxxxxxxxx"
    })

这将导致一个带有"topicsRetrieve2失败“的警报,假设badurlxxxxx确实返回一个non-400 :)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32745699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档