从IPromise获取errorCallback的问题

时间:2014-10-22 04:55:08

标签: javascript angularjs typescript

我正在使用现有的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返回一个函数,如何修改函数以获取错误值?

1 个答案:

答案 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;
        }
    );
}