我通过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;通过类型断言主要基于编译器的欺骗或类似的东西。 如果其他人有想法,我就无法理解这个伎俩。无论它有效与否,我都能澄清它。
答案 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(() => { });
也可能有其他选择,但我希望有所帮助。