【问题标题】:Returning Promise< void > instead of Promise<any>返回 Promise< void > 而不是 Promise<any>
【发布时间】:2017-10-31 13:33:40
【问题描述】:

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

然后我尝试使用链式 promise 调用一些与前一个类似的服务。所以,我收到了这个错误:“Type IPromise is not assignable to type IPromise, Type EntityBase is not assignable to type 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】:

    隐式地,您示例中变量 promise 的类型将是 ng.IPromise&lt;void&gt;,因为这是 $q.when() 返回的内容。
    ng.IPromise&lt;void&gt; 类型的变量无法获得分配给它的 ng.IPromise&lt;EntityBase&gt; 对象。
    根据您想要实现的目标,您可以做不同的事情。

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

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

    您可以在开头显式声明变量的类型为ng.IPromise&lt;any&gt;

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

    或者你可以让你的承诺链最终返回一个无效的承诺:

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

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

    【讨论】:

    • 我正在寻找如何执行链式承诺,这些承诺必须为循环的每次迭代执行。就是这样
    猜你喜欢
    • 2021-08-07
    • 2021-03-17
    • 2018-11-03
    • 2021-02-06
    • 2017-03-17
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    相关资源
    最近更新 更多