javascript - 如何在有数据和无数据的情况下返回成功和错误 promise ?

标签 javascript angularjs typescript

我想在 $http 调用之前或之后返回一个 promise 和一个名为 output 的对象。有人可以告诉我如何使用 AngularJS 框架执行此操作并且使用 Typescript 非常重要,以便我可以确定它是否正常工作?

 topicNewSubmit = (): ng.IPromise<any> => {
    var self = this;
    var myData1 = { abc: 123 }

    if (self.abc = 22) {
        // How can I return an OKAY promise from here?
    }
    if (self.abc = 33) {
        // How can I return an OKAY promise with myData1 from here?
    }
    if (self.abc = 88) {
        // How can I return a FAIL promise from here?
    }

    return self.$http({ url: self.url, method: "GET" })
        .then(
            (response: ng.IHttpPromiseCallbackArg<any>): any => {            
            var myData2 = { abc: 245 }
            // How can I return a promise and myData2. 
            // return(myData2) gives an error with Typescript

            // How can I return a promise and no data
            // return gives an error with Typescript 
        },
        (error: ng.IHttpPromiseCallbackArg<any>): ng.IPromise<any> => {
            var myData3 = { abc: 345 }
            // Is this the correct way to return an unhandled reject with myData3
            return self.$q.reject(myData);
        });
  }

最佳答案

编辑:修复代码并添加 TypeScript Playground example .方法输入正确,您可以通过抛出的输入错误来验证这一点,尝试并修复它们;)。我从 Angular 定义文件中复制了非常基本的必需接口(interface)。

编辑#2:Here's the fixed version上面的 TypeScript Playground 示例。

如果我对您的问题的理解正确,您是在尝试为服务方法定义一个返回类型,声明它返回一个 promise ,其解析结果将是某个对象

在那种情况下,您就快完成了,我已将您的两个示例方法分成不同的 block ,因为它们需要不同的方法。

总的来说,我删除了作用域复制(self = this),因为您正在使用粗箭头方法,它会自动将方法作用域限定到外部词法作用域。简而言之,不需要进行范围复制,事实上,在您的示例中, self 并不总是指向服务(因为您是在方法内部而不是外部复制范围)。

另外,请注意 Angular promise 的定义( chop ):

interface IDeferred<T> {
    resolve(value?: T): void;
    reject(reason?: any): void;
}

因此,输入 Angular Promise 只会为 promise 的 resolve 情况添加类型,而不会为 rejected 情况添加类型。因此,在调用您的服务时,它将验证成功处理程序中的结果是否属于您定义的类型,但错误处理程序中的参数类型是否为 any 类型。 .

主题测试

要使此方法起作用,您需要注入(inject) $q进入您的服务,然后使用它来创建您自己的 deferred

topicTest = (): IPromise<Foo> => { // return a promise which will result in a parameter of MyType upon resolving
    var deferred = this.$q.defer<Foo>(); // Type the deferred to get better 'intellisense' support
    if (this.abc = 99) {
        deferred.resolve(new Foo());
    }
    if (this.abc = 88) {
        deferred.reject("You can pass in whatever you like to the reject case");
    }
    return deferred.promise;
};

主题新提交

$http已经返回 promise ,所以你只需要通过附加 then 来 Hook 这些 promise 回调并从该方法返回以允许链接其他then对其进行回调。

在这种情况下,您的服务方法的返回类型将为 angular.IPromise<() => any>您可以在哪里替换 any用你喜欢的类型。 then 的返回类型方法必须对应于您在服务方法的返回类型中为通用占位符选择的任何类型。

topicNewSubmit = () : IPromise<Foo> => {
    return this.$http({ url: this.url, method: "GET" }).then((response): Foo => {
        return new Foo();
    }, (error) => {
        return "whatever you'd like, it does not have to correspond to Foo";
    });
}

然后您可以像这样使用您的服务

MyService.topicNewSubmit().then((data) => {
    // data needs to be of type T, where T is the type you defined in the generic placeholder of IPromise<T>
}, (error: any) => {
    // In the error case, the parameters are of type any
});

关于javascript - 如何在有数据和无数据的情况下返回成功和错误 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32752684/

相关文章:

javascript - 计算 grunt 观看的文件数

javascript - 获取设置交叉引用

Typescript 将泛型限制为字符串文字类型,以便在计算对象属性中使用

javascript - 阅读更多 阅读更少 陷入 Angular

javascript - 为什么我的 ajax 加载新页面后我的 css 转换不开始?

java - 获取 angular.js 文件 net::ERR_ABORTED

javascript - 如何在路径中传递变量

reactjs - 如何在可重用组件中输入React Hook Form control prop?

javascript - 点击事件同时打开Popup

javascript - 无法将一个 Canvas 放在另一个 Canvas 下