将一个服务呼叫的承诺传递给Angular中的另一个服务

时间:2016-12-20 18:44:33

标签: javascript angularjs asynchronous typescript

所以我有一个服务电话到后端并保存一个对象,该呼叫设置了一个承诺来返回一个号码。

该调用看起来像这样

    saveTcTemplate(item: ITermsConditionsTemplate): ng.IPromise<number> {
        item.modifiedDate = new Date();
        return this.$http.post(this.api + '/SaveTcTemplate', item)
            .then(this.returnData); 
    }

    returnData = (response: any) => {
        return response.data;
    };

这是在创建新对象时,所有字段都设置为所需的值,传递给保存,然后调用以显示。

这是用于在保存对象后拉动对象的get函数。

    getTermsConditions(id: number): ng.IPromise<ITermsConditionsTemplate> {
        return this.$http.get(this.api + '/GetTermsConditions',
            {
                params: {
                    id: id
                }
            }).then(this.returnData);
    }

这是对象的初始构建,保存和获取

                this.newTemplate.copyId = 0;
                this.newTemplate.id = 0;
                this.newTemplate.isLibrary = true;
                this.newTemplate.studyFacilityScheduleId = this.studyFacilityScheduleId;
                this.studyTermsConditionsService.saveTcTemplate(this.newTemplate)
                    .then(this.studyTermsConditionsService.getTermsConditions)
                    .then(this.setTemplateData);

设置完成后,我可以成功保存新项目,并将其ID(ng.IPromise部分)返回给我,并传递给我的Get服务电话。

问题是,当以这种方式设置时,这个。$ http.get返回undefined。从我认为我理解的其他类似的堆栈溢出问题来看,它正在发生,因为我调用函数时没有明确地将任何内容传递给它的参数当我说

.then(this.studyTermsConditionsService.getTermsConditions)

为了测试这个我还设置了保存并得到这样的

                var data: any;
                data = this.studyTermsConditionsService.saveTcTemplate(this.newTemplate);
                this.studyTermsConditionsService.getTermsConditions(data)
                    .then(this.setTemplateData);

这种方法有点奏效。 $ http.Get被识别,可以使用,但这个设置的问题是;由于ng.IPromise的异步性质,数据未作为承诺的数值发送到我的Get函数。它被发送为类型$$ promise,导致我的get函数中的参数为NaN。

所以有一种方法我传递一个可用的值,即32,但是我没有显式传递这个值,所以$ http.get是未定义的。

另一方面,我显式传递了一个参数,因此$ http.get被识别并可用,但显式调用的参数是$$ promise类型,而不是类型编号,不幸的是,似乎ng.IPromise&lt; ;数字&gt;我没有通过调用我的Get函数解决问题。

我如何从这里开始?

1 个答案:

答案 0 :(得分:2)

我猜你被this搞砸了。当您直接将函数引用作为参数传递时,它将与上下文一起丢失。你应该像下面这样明确地调用它们。

<强>代码

this.newTemplate.copyId = 0;
this.newTemplate.id = 0;
this.newTemplate.isLibrary = true;
this.newTemplate.studyFacilityScheduleId = this.studyFacilityScheduleId;
this.studyTermsConditionsService.saveTcTemplate((response) => this.newTemplate(response))
    .then((response) => this.studyTermsConditionsService.getTermsConditions(response))
    .then((response) => this.setTemplateData(response));

否则,您可以让function使用arrow function,这有助于功能内的this上下文。

saveTcTemplate(item: ITermsConditionsTemplate): ng.IPromise<number> { .. }

应该是

saveTcTemplate = (item: ITermsConditionsTemplate): ng.IPromise<number> => { .. }

getTermsConditions(id: number): ng.IPromise<ITermsConditionsTemplate> { .. }

应该是

getTermsConditions = (id: number): ng.IPromise<ITermsConditionsTemplate> => { .. }