打字稿/角度传递值超出此范围?

时间:2017-12-03 17:38:48

标签: javascript angular typescript

因此,在普通的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')
    }

}

3 个答案:

答案 0 :(得分:1)

那是因为您正在调用异步方法subscribe,然后在解析订阅之前尝试记录即将发生的值。在将this.results.emails分配给url变量

之后,将最后两个语句(console.log和return)放在大括号内

答案 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一样订阅。