使用TypeScript进行角度处理 - 如何在可观察的回调中处理业务逻辑?

时间:2018-02-28 02:10:25

标签: javascript angular typescript observable angular-httpclient

我正在尝试使用像这样的Angular HttpClient调用获取一些数据并返回成功:

    return this.http.post('api/my-route', model).subscribe(

        data => (
            this.data = data;
            return $window.location = ReturnUrlService.getAbsolute('/my-other-route');
        )
    )

为什么我不能这样做?我的应用程序是使用TypeScript 2.6.2的Angular 4.3我的理解是箭头函数应该等同于这个回调:

function(data) {
        this.data = data;
        return $window.location = ReturnUrlService.getAbsolute('/my-other-route');
}

...我正在对'数据'进行处理,因为它可以作为JQuery AJAX中的“成功”回调。订阅是否仅限于在类中设置属性的值?我的箭头功能出了什么问题?我知道我错过了一些基本的东西!

1 个答案:

答案 0 :(得分:3)

如果" body"您只能使用()是一种表达。你的身体"是两个陈述:

return this.http.post('api/my-route', model).subscribe(
    data => (
        this.data = data;
        return $window.location = ReturnUrlService.getAbsolute('/my-other-route');
    )
)

应该是:

return this.http.post('api/my-route', model).subscribe(
    data => {                                                    // <==== changed this line
        this.data = data;
        return $window.location = ReturnUrlService.getAbsolute('/my-other-route');
    }                                                            // <==== changed this line
)


return语句

看来你只想执行赋值,而不是返回任何值。如果是这种情况,只需从最后一个语句中删除return关键字


另一方面,如果您确实也希望将该值返回给该函数的调用者,请不要使用subscribe,但是其他函数只会转换Observable },such as map

public myMethod(): Observable<any> {
  // ... create the model variable
  return this.http.post('api/my-route', model).map(
    data => {
        this.data = data;
        return $window.location = ReturnUrlService.getAbsolute('/my-other-route');
    }
  )
}

当然,请记住在您调用myMethod的任何地方订阅结果:

public someOtherMethod() {
  return this.myMethod().subscribe(stuff => console.log(stuff));
}