angular 2 如何从订阅返回数据

IT技术 javascript angular typescript asynchronous
2021-01-14 13:00:10

这就是我想要做的。

@Component({
   selector: "data",
   template: "<h1>{{ getData() }}</h1>"
})

export class DataComponent{
    this.http.get(path).subscribe({
       res => return res;
    })
}

如果getData在 内部调用DataComponent,您可能建议将其分配给变量 likethis.data = res并使用 i like {{data}}。但我需要{{getData}}为自己的目的使用 like 。请建议我?

4个回答

您不能直接返回该值,因为它是一个异步调用。异步调用意味着它在后台运行(实际上是安排稍后执行),而您的代码继续执行。

您也不能直接在类中使用此类代码。它需要移动到方法或构造函数中。

你可以做的不是subscribe()直接而是使用像这样的操作符map()

export class DataComponent{
    someMethod() {
      return this.http.get(path).map(res => {
        return res.json();
      });
    }
}

此外,您可以将多个.map与相同的 Observable组合在一起,因为有时这会提高代码的清晰度并保持独立。例子:

validateResponse = (response) => validate(response);

parseJson = (json) => JSON.parse(json);

fetchUnits() {
    return this.http.get(requestUrl).map(this.validateResponse).map(this.parseJson);
}

这样一个 observable 将返回调用者可以订阅的

export class DataComponent{
    someMethod() {
      return this.http.get(path).map(res => {
        return res.json();
      });
    }

    otherMethod() {
      this.someMethod().subscribe(data => this.data = data);
    }
}

调用者也可以在另一个class。这里只是为了简洁。

data => this.data = data

res => return res.json()

是箭头函数。它们类似于正常功能。当数据从响应到达时,这些函数被传递到可观察对象subscribe(...)map(...)从可观察对象调用。这就是为什么不能直接返回数据的原因,因为someMethod()完成时,数据还没有收到。

嗨 Neyxo,你能不能看看我的问题:stackoverflow.com/questions/51551895/...
2021-03-27 13:00:10
你有一个错字,第一个curl刹车应该在“res =>”部分之后,像这样: res => { return res; }
2021-04-09 13:00:10

我知道的两种方式:

export class SomeComponent implements OnInit
{
    public localVar:any;

    ngOnInit(){
        this.http.get(Path).map(res => res.json()).subscribe(res => this.localVar = res);
    }
}

一旦返回信息,就像在Promise中一样,这会将您的结果分配给局部变量。然后你就做{{ localVar }}

另一种方法是将 observable 作为 localVariable。

export class SomeComponent
{
    public localVar:any;

    constructor()
    {
        this.localVar = this.http.get(path).map(res => res.json());
    }
}

这样你就暴露了一个可观察的对象,此时你可以在你的 html 中使用 AsyncPipe {{ localVar | async }}

请尝试一下,让我知道它是否有效。此外,由于 angular 2 还很新,如果有什么问题,请随时发表评论。

希望能帮助到你

这里的信息真的很有趣@querty_igor 这种方式和 Subject() 有什么区别
2021-03-19 13:00:10
如果我没记错的话,主题无论如何都是可观察的。它主要用于转发数据,然后您的服务或组件订阅它,但此时它是可观察的。所以 Subject()->next() -> asObserable()-> observable.subscribe()。有一段时间没有使用 angular 2。如果我错了,请纠正我。谢谢
2021-03-26 13:00:10

将这个存储在一个可以在 subscribe 之外使用的变量中怎么样?

this.bindPlusService.getJSONCurrentRequestData(submission).map(data => {
    return delete JSON.parse(data)['$id'];
});

我已经用这种方式很多次了......

@Component({
   selector: "data",
   template: "<h1>{{ getData() }}</h1>"
})

export class DataComponent{
    this.http.get(path).subscribe({
       DataComponent.setSubscribeData(res);
    })
}


static subscribeData:any;
static setSubscribeData(data):any{
    DataComponent.subscribeData=data;
    return data;
}

使用静态关键字并节省您的时间...在这里您可以使用静态变量或直接返回您想要的对象....希望它会帮助您...快乐编码...