簡體   English   中英

打字稿/角度通過值呢?

[英]typescript/angular pass value out of this?

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

}

那是因為你調用異步方法subscribe ,然后試圖登錄來臨前值訂閱解決。 在將this.results.emails分配給url變量之后,將最后兩個語句(console.log和return)放在花括號內

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')
        });

}

根據反應式編程,這是您得到的預期行為。 由於訂閱方法是異步的,因此稍后在接收數據時會得到結果。 但是您的控制台日志在同步線程中被調用,因此在您定義subscribe方法時將立即調用它。 如果要打印控制台。 將其放在您的訂閱數據塊中。

更新:

根據您的要求,您應該返回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一樣訂閱該主題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM