Javascript 如何处理调用在defer.resolve()中返回承诺的函数?
我有一个AngularJS函数,它使用$q。在函数中,我调用了%http,在.then函数中,我返回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=这个;
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