在TypeScript中,如何定义返回承诺的递归函数
我们仍然使用angular 1.5.8,我尝试编写一个函数,将长时间的计算分解为部分。由于承诺可以与返回承诺的函数链接在一起,我想这样写:在TypeScript中,如何定义返回承诺的递归函数,typescript,promise,settimeout,Typescript,Promise,Settimeout,我们仍然使用angular 1.5.8,我尝试编写一个函数,将长时间的计算分解为部分。由于承诺可以与返回承诺的函数链接在一起,我想这样写: interface IResult { add(s: string): void { ... } } function buildResult(): IResult { ... } function handleItem(s: string): string { ... } function doWork(data: string[]): ng.
interface IResult {
add(s: string): void { ... }
}
function buildResult(): IResult { ... }
function handleItem(s: string): string { ... }
function doWork(data: string[]): ng.IPromise<IResult> {
let i = 0;
const result = buildResult();
const process = (): ng.IPromise<IResult> => {
for(let start = i; i < start + 100; ++i) {
const item = data[i];
if(!item) {
return $q.resolve(result);
}
result.add(handleItem(item));
}
return $timeout(process, 20)
}
return process();
}
接口IResult{
添加(s:string):void{…}
}
函数buildResult():IResult{…}
函数handleItem(s:string):字符串{…}
函数doWork(数据:字符串[]):ng.IPromise{
设i=0;
const result=buildResult();
常量进程=():ng.IPromise=>{
for(让start=i;i
这是可行的,但TypeScript编译器会抱怨,因为Angular$timeout服务接受一个返回值而不是承诺的函数:
TS2322:类型“IPromise”不可分配给类型“IPromise”。类型“IPromise”中缺少属性“add”
是否有方法正确定义此函数中的类型
我可以看到两种选择:
any
返回$timeout(进程,20)作为ng.IPromise的任意值
有更好的主意吗?$timeout签名是:
interface ITimeoutService {
(delay?: number, invokeApply?: boolean): IPromise<void>;
<T>(fn: (...args: any[]) => T, delay?: number, invokeApply?: boolean, ...args: any[]): IPromise<T>;
cancel(promise?: IPromise<any>): boolean;
}
$timeout
创建一个新的deferred并像deferred.resolve(fn.apply(null,args))一样解析它代码>,在fn返回承诺时充当承诺链
所以,这里的问题是$timeout签名$超时签名应为:
interface ITimeoutService {
(delay?: number, invokeApply?: boolean): IPromise<void>;
<T>(fn: (...args: any[]) => T | IPromise<T>, delay?: number, invokeApply?: boolean, ...args: any[]): IPromise<T>;
cancel(promise?: IPromise<any>): boolean;
}
接口ITimeoutService{
(delay?:number,invokeApply?:boolean):IPromise;
(fn:(…args:any[])=>T | IPromise,delay?:number,invokeApply?:boolean,…args:any[]):IPromise;
取消(承诺?:i承诺。在这里解决了。
interface ITimeoutService {
(delay?: number, invokeApply?: boolean): IPromise<void>;
<T>(fn: (...args: any[]) => T | IPromise<T>, delay?: number, invokeApply?: boolean, ...args: any[]): IPromise<T>;
cancel(promise?: IPromise<any>): boolean;
}