Javascript 如何处理调用在defer.resolve()中返回承诺的函数?

Javascript 如何处理调用在defer.resolve()中返回承诺的函数?,javascript,angularjs,typescript,Javascript,Angularjs,Typescript,我有一个AngularJS函数,它使用$q。在函数中,我调用了%http,在.then函数中,我返回defer.resolve()或defer.reject() 然而,我意识到,在解决之前,我需要进入一个不同的状态,我使用this.$state.go(…)返回一个承诺 所以我很困惑。我的代码需要一个defer.resolve(),那么我该如何处理这个问题呢。我可以返回这个。$state.go(…) topicDeleteSubmit=():ng.IPromise=>{ var self=这个;

我有一个AngularJS函数,它使用$q。在函数中,我调用了%http,在.then函数中,我返回
defer.resolve()
defer.reject()

然而,我意识到,在解决之前,我需要进入一个不同的状态,我使用
this.$state.go(…)
返回一个承诺

所以我很困惑。我的代码需要一个defer.resolve(),那么我该如何处理这个问题呢。我可以返回
这个。$state.go(…)

topicDeleteSubmit=():ng.IPromise=>{
var self=这个;
var defer=self.$q.defer();
self.$http({
url:self.url,
方法:“删除”
})
.那么(
(回复:ng.ihttpromisecallbackarg):any=>{
//原始代码
此.$state.go('home.subjects.subject.admin.topics'{
主体:this.sus.subject.id
});
defer.resolve();
//新代码
返回此.state.go('home.subjects.subject.admin.topics'{
主体:this.sus.subject.id
});
},
(错误):any=>{
拒绝(错误);
}
)
回报、承诺;
}
更新


我的测试似乎表明,我确实需要在邓肯的答案中加入我自己的延迟。我欢迎其他人的评论来证实这一点或证明我错了

您可以等待,
$state.go()
返回的承诺解决后再解决原始承诺:

            this.$state.go('home.subjects.subject.admin.topics', {
                subjectId: this.sus.subject.id
            }).then(function() {
                defer.resolve();
            });

您可以等待,
$state.go()
返回的承诺解决后,再解决原始承诺:

            this.$state.go('home.subjects.subject.admin.topics', {
                subjectId: this.sus.subject.id
            }).then(function() {
                defer.resolve();
            });

我将在回答之前先提出一个警告。我对angularjs不太了解,但我对承诺非常了解

topicDeleteSubmit = (): ng.IPromise<any> => {
    // Not bothering with 'self'; properly-compiled arrow functions () => should
    // inherit `this`.
    return this.$http({
        url: this.url,
        method: "DELETE"
    })
        .then(
        (response: ng.IHttpPromiseCallbackArg<any>): any => {
                return this.$state.go('home.subjects.subject.admin.topics', {
                    subjectId: this.sus.subject.id
                });
            }
            // by not including an error handler, the method that calls this one
            // will need to resolve any errors. Any low-level errors will copy
            // over to the promise that expects their result. (similar to
            // exception handling)
            );
}
topicDeleteSubmit=():ng.IPromise=>{
//不必使用“self”;正确编译的箭头函数()=>应该
//继承“这个”。
返回此文件。$http({
url:this.url,
方法:“删除”
})
.那么(
(回复:ng.ihttpromisecallbackarg):any=>{
返回此.state.go('home.subjects.subject.admin.topics'{
主体:this.sus.subject.id
});
}
//通过不包含错误处理程序,调用此错误处理程序的方法
//将需要解决任何错误。任何低级错误都将被复制
//向期望其结果的承诺(类似于
//异常处理)
);
}

我将在回答之前提出警告。我对angularjs不太了解,但我对承诺非常了解

topicDeleteSubmit = (): ng.IPromise<any> => {
    // Not bothering with 'self'; properly-compiled arrow functions () => should
    // inherit `this`.
    return this.$http({
        url: this.url,
        method: "DELETE"
    })
        .then(
        (response: ng.IHttpPromiseCallbackArg<any>): any => {
                return this.$state.go('home.subjects.subject.admin.topics', {
                    subjectId: this.sus.subject.id
                });
            }
            // by not including an error handler, the method that calls this one
            // will need to resolve any errors. Any low-level errors will copy
            // over to the promise that expects their result. (similar to
            // exception handling)
            );
}
topicDeleteSubmit=():ng.IPromise=>{
//不必使用“self”;正确编译的箭头函数()=>应该
//继承“这个”。
返回此文件。$http({
url:this.url,
方法:“删除”
})
.那么(
(回复:ng.ihttpromisecallbackarg):any=>{
返回此.state.go('home.subjects.subject.admin.topics'{
主体:this.sus.subject.id
});
}
//通过不包含错误处理程序,调用此错误处理程序的方法
//将需要解决任何错误。任何低级错误都将被复制
//向期望其结果的承诺(类似于
//异常处理)
);
}

几个问题。在“this.$state.go…阅读您的答案之前,我本来有一个报税表,我可以假设这是错误的做法吗?我也可以假设,为了使其100%有效,我还需要在中使用defer.reject。然后(…感谢您的
延迟.拒绝
呼叫可能没有问题。如果
$state.go
可能失败,您可能会添加另一个拒绝呼叫,但如果不太可能失败,则可能不需要。我怀疑是否需要您的
返回
,因为
$http
返回的承诺不会在意发生什么事情u return.charlietfl提到这是一种反模式,但作为州政府,go返回承诺这是我唯一能想到的方法。你看到其他方法了吗?谢谢,有很多问题。我以前有过一次返回”这个.$state.go…阅读你的答案,我能假设这是错误的方法吗?我也能假设,为了使它100%有效,我还需要在中使用defer.reject。然后(…感谢您的
延迟.拒绝
呼叫可能没有问题。如果
$state.go
可能失败,您可能会添加另一个拒绝呼叫,但如果不太可能失败,则可能不需要。我怀疑是否需要您的
返回
,因为
$http
返回的承诺不会在意发生什么事情u return.charlietfl提到这是一个反模式,但作为state.go返回一个承诺,这是我唯一能想到的方法。你看到其他方法了吗。谢谢你完全摆脱
$q
,只返回
$http
。你正在使用反模式,因为
$http
已经返回了一个promise@charlietfl-我明白了你在说什么,但是如果“this.$state.go(…)(返回一个承诺),那么它将如何工作返回了失败的承诺,因为状态更改不起作用时发生了一些事情?如果您刚刚调用了
$http
,我同意@charlietfl,但由于您自己使用它来触发一些其他操作,我认为在这种情况下,您希望创建自己的承诺,以便在所有操作完成后得到解决。但是服务器上实际的
删除操作已完成,因此如果您使用
$state.go失败,您将向用户显示什么问题?statechange错误处理程序将覆盖它,不是吗?@Anne如果$state.go失败,错误将沿承诺链向上移动并生成topicDe