我正在使用现有的TypeScript
方法,并且我很难从承诺中获得errorCallback
值。接口类似于Angular的类型定义文件中的以下内容:
interface IPromise<T> {
then<TResult>(successCallback: (promiseValue: T) => IHttpPromise<TResult>, errorCallback?: (reason: any) => any, notifyCallback?: (state: any) => any): IPromise<TResult>;
then<TResult>(successCallback: (promiseValue: T) => IPromise<TResult>, errorCallback?: (reason: any) => any, notifyCallback?: (state: any) => any): IPromise<TResult>;
then<TResult>(successCallback: (promiseValue: T) => TResult, errorCallback?: (reason: any) => TResult, notifyCallback?: (state: any) => any): IPromise<TResult>;
我正在使用的TypeScript
方法调用服务,而promise使用return(这有效):
public loadSavedLogin(): ng.IPromise<MyApp.Models.User> {
return this._myAppService.getUser(this.savedUserId).then((result: MyApp.Models.User) => {
if (result) {
this.userId = result.UserID;
this.userName = result.UserName;
}
return result;
});
}
问题是我不知道如何获得errorCallback
值。如果我在.then((result: MyApp.Models.User)
之后放置逗号,我会看到Intellisense向我显示errorCallback
参数,但我无法使任何语法正常工作。在原始JS
中,我最后有一个逗号,另一个函数接受错误值,但是我不确定这个接口如何返回错误。
如果服务调用使用IPromise
返回一个函数,如何修改函数以获取错误值?
答案 0 :(得分:2)
这是一个帮助您解决的简化示例。
class Test {
public _test: ng.IPromise<string>;
// This method has a return type of ng.IPromise<string>
// You must return a value of this type.
public example(): ng.IPromise<string> {
return this._test.then(
// Success
// Must return a string to be compatible with
// the ng.IPromise<string> return type
(val) => {
alert('Success');
return val;
},
// Error
// Should also return a string to be
// compatible with the return type
(reason) => {
alert('Error: ' + reason);
return '';
});
}
}
由于example
方法返回类型为ng.IPromise<string>
,因此then
方法中的成功函数和错误函数必须返回string
才能将类型归于所有类型匹配。
在您的情况下,他们应该返回MyApp.Models.User
的实例。
我怀疑你的error
函数中没有返回值 - 但这是成功和错误函数void
之间的最佳公共类型。
进一步的例子......在使用函数时只使用数组来显示最常见的类型:
var example = [
(input: string) => { return 'String'; },
(input: string) => { console.log(input); }
];
此示例中使用的最佳常见类型是(input: string) => void
。看起来很奇怪 - 但它确实有意义。如果调用此数组中的函数,则不要期望获得返回值。
因此,请确保您的成功和错误函数具有相同的返回类型,并且所有类型都将与您匹配。
public loadSavedLogin(): ng.IPromise<MyApp.Models.User> {
return this._myAppService.getUser(this.savedUserId).then(
(result: MyApp.Models.User) => {
if (result) {
this.userId = result.UserID;
this.userName = result.UserName;
}
return result;
},
(reason: string) => {
return <MyApp.Models.User> null;
}
);
}