我通过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.So调用一些与前一个类似的服务,我得到了以下错误:“IPromise类型不能分配给IPromise类型,EntityBase类型不能分配给类型IPromise”
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“,这种断言主要是基于编译器的欺骗或诸如此类的。我不理解这个技巧,如果其他人有一个idea..could,他会澄清它,不管它是否有效。
发布于 2017-05-31 00:54:31
在您的示例中,变量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 = promise.then(() => {... your chain ...}).then(() => { });也许还有其他选择,但我希望这会有所帮助。
https://stackoverflow.com/questions/44273022
复制相似问题