返回承诺&lt;无效&gt;而不是承诺<any>

时间:2017-05-30 22:41:10

标签: angularjs typescript angular-promise

我通过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;
        }

然后我尝试调用一些类似于前一个带链接promises的服务。所以,我得到了这个错误:&#34;类型IPromise不能分配给类型IPromise,类型EntityBase不能分配给类型void&# 34;

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

我经常搜索这种困境和所有我所拥有的,一种不起眼的方法来转换我的功能&#39;回归共同模式&#34; IPromise&#34;通过类型断言主要基于编译器的欺骗或类似的东西。 如果其他人有想法,我就无法理解这个伎俩。无论它有效与否,我都能澄清它。

1 个答案:

答案 0 :(得分: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(() => { ...

或者您可以让您的承诺链最终实际返回void的承诺:

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

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

相关问题