如何调试 Angular2/Typescript 中的 Observable 值?
How to debug Observable values in Angular2 / Typescript?
我已经按照 angular 2 的教程进行操作,并且具有异步呈现英雄列表的搜索功能。
<div *ngFor="let hero of heroes | async">
{{hero.name}}
</div>
在组件中我有可观察的英雄:
heroes: Observable<Hero[]>;
现在我已经在我的应用程序中实现了类似的功能,我没有看到任何东西,也没有看到任何错误。我在 Chrome 中打开调试器并尝试检查 heroes 的值,但它当然只是一些 Observable 包装器。
有没有办法在调试器中查看 current/last 或某些值,或者是否有其他技术可以调试此类问题?
首先,如果您使用的是打字稿,请考虑:
heroes: Observable<Array<Hero>>;
如果你想打印它,你可以简单地添加你的代码:
heroes.subscribe((v) => console.log('got new heroes list: ', v));
关于这个主题有几篇文章,但最容易使用 do()
运算符来查看您的运算符链中发生了什么。
阅读更多:
您可以使用 do() 运算符 EX :
this.http
.get('someUrl', options)
.map(res => res.json())
.do(
data => {
console.log(data);
},
error => {
console.log(error)
}
)
如果 do() 函数内部没有任何反应,则表示您没有订阅该 observable,请记住 observable 正在等待订阅开始做某事。
在 RxJS v6+ 中,tap()
运算符取代了 do()
。所以它现在看起来更像了:
someObservable$.pipe(
map(x => x.whatever),
tap(whatever => console.log(whatever)),
)
如果你想做一些console.log
调试,我在s-rxjs-utils
中写了一个小帮手logValues()
。您可以像这样使用它(来自文档):
of(1, 2).pipe(logValues()).subscribe();
// prints using console.log:
// [value] 1
// [value] 2
// [complete]
您还可以向其传递一个字符串以与值一起打印,并指定日志级别。
由于在我的调试经验中,我需要的信息比使用 tap
运算符记录的信息要多,因此我为此编写了一个库 1log:
import { log } from '1log';
import { timer } from 'rxjs';
timer(500).pipe(log).subscribe();
您可以使用 .pipe() 进行记录,如图所示。
constructor(
private variable: Variable<any>
) {
this.field= this.variable.select<any>(state => state.field).pipe(
tap(Value => console.log('Field: ', Value ))
);
}
我已经按照 angular 2 的教程进行操作,并且具有异步呈现英雄列表的搜索功能。
<div *ngFor="let hero of heroes | async">
{{hero.name}}
</div>
在组件中我有可观察的英雄:
heroes: Observable<Hero[]>;
现在我已经在我的应用程序中实现了类似的功能,我没有看到任何东西,也没有看到任何错误。我在 Chrome 中打开调试器并尝试检查 heroes 的值,但它当然只是一些 Observable 包装器。
有没有办法在调试器中查看 current/last 或某些值,或者是否有其他技术可以调试此类问题?
首先,如果您使用的是打字稿,请考虑:
heroes: Observable<Array<Hero>>;
如果你想打印它,你可以简单地添加你的代码:
heroes.subscribe((v) => console.log('got new heroes list: ', v));
关于这个主题有几篇文章,但最容易使用 do()
运算符来查看您的运算符链中发生了什么。
阅读更多:
您可以使用 do() 运算符 EX :
this.http
.get('someUrl', options)
.map(res => res.json())
.do(
data => {
console.log(data);
},
error => {
console.log(error)
}
)
如果 do() 函数内部没有任何反应,则表示您没有订阅该 observable,请记住 observable 正在等待订阅开始做某事。
在 RxJS v6+ 中,tap()
运算符取代了 do()
。所以它现在看起来更像了:
someObservable$.pipe(
map(x => x.whatever),
tap(whatever => console.log(whatever)),
)
如果你想做一些console.log
调试,我在s-rxjs-utils
中写了一个小帮手logValues()
。您可以像这样使用它(来自文档):
of(1, 2).pipe(logValues()).subscribe();
// prints using console.log:
// [value] 1
// [value] 2
// [complete]
您还可以向其传递一个字符串以与值一起打印,并指定日志级别。
由于在我的调试经验中,我需要的信息比使用 tap
运算符记录的信息要多,因此我为此编写了一个库 1log:
import { log } from '1log';
import { timer } from 'rxjs';
timer(500).pipe(log).subscribe();
您可以使用 .pipe() 进行记录,如图所示。
constructor(
private variable: Variable<any>
) {
this.field= this.variable.select<any>(state => state.field).pipe(
tap(Value => console.log('Field: ', Value ))
);
}