返回Promise< void >而不是Promise<any>

问题描述 投票:0回答:1

我通过 AngularJS 开发了许多具有相同签名的异步函数,即 app.Domain.GenericModel.EntityBase (我的通用模型) 这是一个示例:

get(resource: string): ng.IPromise<app.Domain.GenericModel.EntityBase[]> {
            var self = this;
            var deferred = self.qService.defer();
            self.httpService.get(resource).then(function (result: any) {
                deferred.resolve(result.data);
            }, function (errors) {
                self.exception = new app.Exceptions.Model.Exception(errors.status, errors.statusText);
                deferred.reject(self.exception);
            });

            return deferred.promise;
        }

然后我尝试使用链式承诺调用一些与前一个类似的服务。因此,我收到此错误:“类型 IPromise 不可分配给类型 IPromise,类型 EntityBase 不可分配给类型 void”

   var self = this; 
    var promise = self.$q.when();
    promise = promise.then(() => {
                                            return self.EcritureService.get(critureToSave);
                                        }).then((compte: EntityBase) => {
                                            return self.CompteService.getSingle(Number(data.compte));
                                        }).then((EntityBase) => {
                                            currentAccount.montantCpt = currentAccount.montantCpt + montant;
                                            return self.CompteService.update(currentAccount:EntityBase);
                                        });

我搜索了很多这个困境和我所拥有的,一个不起眼的方法,通过类型断言将我的函数的返回转换为常见模式“IPromise”,这主要基于编译器的欺骗或类似的东西。 如果其他人有想法,我不理解这个技巧..无论它是否有效,他能否澄清它。

angularjs typescript angular-promise
1个回答
0
投票

隐式地,示例中变量

promise
的类型将是
ng.IPromise<void>
,因为这就是
$q.when()
返回的内容。
类型为
ng.IPromise<void>
的变量无法获取分配给它的
ng.IPromise<EntityBase>
对象。
根据您想要实现的目标,您可以做不同的事情。

你可以使用另一个变量来保存你以后的承诺:

let anotherPromise = promise.then(() => { ...

您可以在开头显式声明变量的类型为

ng.IPromise<any>

let promise: ng.IPromise<any> = self.$q.when();
let promise = promise.then(() => { ...

或者你的 Promise 链最终可能会返回一个 void Promise:

promise = promise.then(() => {... your chain ...}).then(() => { });

可能还有其他选择,但我希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.