【发布时间】:2017-06-09 21:20:16
【问题描述】:
我们仍然使用 angular 1.5.8,我尝试编写一个函数,将长时间的计算分解为部分。由于可以将 promise 与返回 promise 的函数链接起来,所以我想这样写:
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();
}
这可行,但 TypeScript 编译器会抱怨,因为 Angular $timeout 服务接受一个返回值的函数,而不是一个承诺:
TS2322:类型“IPromise
”不可分配给类型“IPromise”。 “IPromise ”类型中缺少属性“add”。
有没有办法在这个函数中正确定义类型?
我可以看到两个选择:
- 定义进程返回
any - 转换返回语句:
return $timeout(process, 20) as any as ng.IPromise<IResult>
有更好的主意吗?
【问题讨论】:
标签: typescript promise settimeout