Angular 如何在4中返回值
我不熟悉角度观测。我有一个问题,我想在subscribe方法中返回一个值。我有 以下方法(Angular 如何在4中返回值,angular,typescript,rxjs,observable,Angular,Typescript,Rxjs,Observable,我不熟悉角度观测。我有一个问题,我想在subscribe方法中返回一个值。我有 以下方法(getFirebaseData(idForm:string):observable): 第一个console.log(totalQuestions)打印4,但第二个console.log(totalQuestions)打印未定义的。 我知道subscribe是一个异步操作,因此第二个控制台.log(totalQuestions)(“为了编写代码”)打印未定义的内容,但我找不到在subscribe方法完成后返
getFirebaseData(idForm:string):observable
):
第一个console.log(totalQuestions)
打印4,但第二个console.log(totalQuestions)
打印未定义的。
我知道subscribe是一个异步操作,因此第二个控制台.log(totalQuestions)
(“为了编写代码”)打印未定义的内容,但我找不到在subscribe方法完成后返回变量的方法。现在,如果我更改订阅地图:
getTotalQuestions(idForm:string){
let totalQuestions:number;
this.getFirebaseData(idForm+"/Metadatos")
.subscribe(items =>
{
items.map(item => {
totalQuestions=item.Total;
console.log(totalQuestions);
});
}
);
console.log(totalQuestions);
return totalQuestions;
}
第一个console.log(totalQuestions)
不打印任何内容,第二个console.log(totalQuestions)
打印未定义的内容。我不明白为什么会这样
我希望你能帮我澄清我不理解的概念。谢谢 Observable在您订阅它时运行,并且订阅返回的内容始终是订阅对象,如setInterval。第一个示例:因为这是一个异步调用,所以第二个console.log在执行之前不会等待subscribe完成
getTotalQuestions(idForm:string){
让我们来提问:数字;
返回此.getFirebaseData(idForm+“/Metadatos”).pipe(
地图(项目=>
items.map(item=>{
totalQuestions=item.Total;
控制台日志(总问题);
});
));
}
getTotalQuestions('231')。订阅(console.log)
您不能直接返回这样的问题,您需要使用主题来实现这一点
getTotalQuestions(idForm:string): Observable<string> {
let totalQuestions:number;
var subject = new Subject<string>();
this.getFirebaseData(idForm+"/Metadatos")
.subscribe(items => {
items.map(item => {
totalQuestions=item.Total;
console.log(totalQuestions);
subject.next(totalQuestions);
});
}
);
return subject.asObservable();
}
getTotalQuestions(idForm:string):可观察{
让我们来提问:数字;
var subject=新的subject();
这个.getFirebaseData(idForm+“/Metadatos”)
.订阅(项目=>{
items.map(item=>{
totalQuestions=item.Total;
控制台日志(总问题);
主题。下一步(全部问题);
});
}
);
返回subject.asObservable();
}
用法:getTotalQuestion(idForm).subscribe((r)=>console.log(r))
。
您无需启动订阅即可对数组进行转换或将某些对象减少为单个值,以下是我的方法。
您的服务
getTotalQuestions(idForm: string): Observable<any> {
return this.getFirebaseData(`${idForm}/Metadatos`)
.pipe(map(items => items
.map(item => item.Total)
.reduce((a, b) => a+b), 0));
}
为了解决这个问题,我将创建一个属性
totalQuestions$
一个可观察的
在TS文件中
totalQuestions$ = this.getFirebaseData(idForm + "/Metadatos").pipe(
map(items => items.reduce((prev, {Total}) => prev + Total), 0)))
)
现在,您可以在模板中使用async
pipe
<span>{{ totalQuestions$ | async }}</span>
请检查以下内容,我们必须理解,我试图做的是一个反模式,不能强制异步任务同步,因此,包含一个可观察对象的方法通常返回另一个可观察对象或不返回任何内容。因此,我接受这个答案作为解决办法。多谢各位@Rajani Kanth你也能检查一下这个问题吗?这和上面的问题一样!你是冠军!谢谢,谢谢!在所有的rxjs方法中,没有一个像angularjs中的延迟承诺那样工作,这似乎很疯狂。这很有效,所以这里没有返回值?
totalQuestions$ = this.getFirebaseData(idForm + "/Metadatos").pipe(
map(items => items.reduce((prev, {Total}) => prev + Total), 0)))
)
<span>{{ totalQuestions$ | async }}</span>
newVariable$ = combineLatest([totalQuestions$, ...]).pipe(
map(([totalQuestions, ... ]) => {
// Perform an operation here and return a value
})
)