服务互相调用时检测到Typescript循环依赖

时间:2018-06-27 06:29:44

标签: angular typescript

我有2个服务组件: PromiseService.service.ts(处理延迟调用和异步调用)

@Injectable()
export class PromiseService{
    constructor(private staffservice: StaffService) {}
    defercall(asyncCalls, syncCalls) {
        return new Promise((resolve, reject) => {
        const promises = asyncCalls.map(function(val){return val();});
        Promise.all(promises).then(result => {
            resolve(result); });
        });
    }
}

和StaffService.service.ts(处理员工信息)

@Injectable()
export class StaffService{
    constructor(private promises: PromiseService) {}
    updateStaffInfo(){
        this.promises.defercall(this.updateid, this.updateaddress);
    }
    updateid() {
    }
}

但是,我遇到以下错误:

检测到循环依赖: StaffService.service.ts-> PromiseService.service.ts-> StaffService.service.ts

我尝试更改Promise Service组件并删除了以下几行:

但是,出现另一个错误: 未处理的承诺拒绝:无法读取未定义的属性'updateid';区域:任务:Promise.then;值:TypeError:无法读取未定义的属性'updateid'

如何使PromiseService识别“ this”是指StaffService? 我已经被这个错误困扰了1周。谢谢!

更新: 感谢您的答复。我已在PromiseService中删除了StaffService声明,更新后的StaffService打字稿是:

@Injectable()
export class StaffService{
    staffid: any;
    staffaddress: any;
    constructor(private promises: PromiseService){}
    updateid(id) {
        this.staffid = id;
    }
    updateStaffInfo() {
        promises.defercall(this.updateid, this.updateaddress);
    }
    updateaddress(address) {
        this.staffaddress = address;
    }
}

但是当我运行应用程序(ngserve)时,出现以下错误:

未处理的承诺拒绝:无法读取undefined的属性'updateid';区域:任务:Promise.then;值:TypeError:无法读取未定义的属性'updateid'

未处理的承诺拒绝:无法读取未定义的属性'updateaddress';区域:任务:Promise.then;值:TypeError:无法读取未定义的属性'updateaddress'

非常感谢您。

2 个答案:

答案 0 :(得分:0)

更改

constructor(private staffservice: StaffService) {}

收件人

constructor() {}

您的Promise服务不需要对业务服务的依赖。

答案 1 :(得分:0)

您的代码有误,this.updateid是什么?如果您这样引用,则称为变量,但不会对任何变量进行贴花。

然后只有这样的错误显示。Cannot read property 'updateid' of undefined

您必须像这样引用方法使用。 this.updateid()确保该方法返回一些值。如果不返回值,它将仍然发生未定义的错误。还有你的方法没有实现。

您的PromiseService服务文件无需这样声明。请删除。

constructor(private staffservice: StaffService) {}

请解决这些问题,然后运行,让我知道一次。