因此,在普通的javascript中,如果我想为变量赋值,然后在函数外使用该值,则首先声明变量,然后在函数中定义它的值。我是打字稿和棱角分明的新手,所以我不知道怎么做。
在下面的代码中,我试图从服务中的方法获取值,然后将该值传递给我的返回值。 (我希望这是有道理的)。但是我在console.log(url)
上一直没有定义,没有其他错误。
emailsAPI() {
let url: any
this.apiUrlsService.urlsAPI().subscribe(
data => {
this.results = data
url = this.results.emails
}
);
console.log(url)
return this.http.get('assets/api/email_list.json')
}
api-urls服务:
import { Injectable } from '@angular/core';
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
@Injectable()
export class ApiUrlsService {
constructor(
private http: HttpClient
) { }
urlsAPI () {
return this.http.get('assets/api/api_urls.json')
}
}
答案 0 :(得分:1)
那是因为您正在调用异步方法subscribe
,然后在解析订阅之前尝试记录即将发生的值。在将this.results.emails
分配给url
变量
答案 1 :(得分:1)
emailsAPI(): Observable<any> {
let url: any
return this.apiUrlsService.urlsAPI()
.flatMap(data => {
this.results = data
url = this.results.emails
// you can now access url variable
return this.http.get('assets/api/email_list.json')
});
}
答案 2 :(得分:0)
根据反应式编程,这是您获得的预期行为。由于订阅方法是异步的,因此您将在以后收到数据时获得结果。但是您的控制台日志在同步线程中调用,因此只要您定义订阅方法就会调用它。如果您想要打印控制台。把它放在你的订阅数据块中。
<强>更新强>
根据您的要求,您应该返回Subject而不是Observable作为Subject作为数据使用者以及数据生成者。因此,它将使用来自电子邮件的httpget请求的数据,并在您调用emailsAPI方法的方法中充当生产者。
emailsAPI(): Subject<any> {
let emailSubject:Subject = new Subject();
this.apiUrlsService.urlsAPI()
.flatMap(data => {
this.results = data
return this.results.emails;
}).
subscribe(url=> {
this.http.get(your_email_url_from_url_received).subscribe(emailSubject);
});
return emailSubject;
}
主题可以与你在calee方法中使用Observable一样订阅。