我已经阅读了很多内容,并且我理解我的问题可能与许多其他问题重复,但我似乎无法找到/理解我找到的任何答案。
我试图创建一个函数,它将从异步调用返回后端的响应,而不是prommise或observable。我尝试过这些方法,但它们都没有用。请帮助我理解如何将响应作为变量返回。
callQuery() {
return new Promise(resolve => {
this.httpclient.get(MyUrl).subscribe((response) => {
resolve(response);
});
});
}
callQuery() {
return new Promise((resolve, reject) => {
this.httpclient.get(MyUrl).subscribe((response) => {
resolve(response);
});
})['__zone_symbol__value'];
}
async callQuery() {
return await new Promise((resolve, reject) => {
this.httpclient.get(MyUrl).subscribe((response) => {
resolve(response);
});
});
}
因此,console.log(callQuery())
不断返回一个名为ZoneAwarePromise
的物体。在这个对象里面实际上有一个名为__zone_symbol__value
的键可以保存我的响应。但我不知道如何访问它(例如上面的第二个函数不能按预期工作)。
我觉得我的问题解决方法最好:
async callQuery() {
return await new Promise((resolve, reject) => {
this.httpclient.get(MyUrl).subscribe((response) => {
resolve(response);
});
});
}
async WhateverFunction() {
...
const MyVar = await this.callQuery());
console.log(MyVar);
...
}
您应该使用Observables,因为它们比承诺更容易开发。
但是,既然你问过,这里有一个stackblitz向你展示如何从可观察者创造承诺。
停止自己创建promises,并依赖Observable本身:
ngOnInit() {
this.createPromiseFromObservable(this.createDelayedObservable()).then(() => {
console.log('Promise fullfilled');
});
}
createDelayedObservable() {
return of(true)
.pipe(delay(500));
}
createPromiseFromObservable(obs: Observable<any>) {
return obs.toPromise();
}
用异步编辑新的stackblitz并等待:
// Declare the function as async to use await
async ngOnInit() {
// awaits for the result, then prints it in console.
// Remove this.createDelayedObservable() and use this.http.get(...) for real HTTP calls
const res = await this.createPromiseFromObservable(this.createDelayedObservable());
console.log(res);
}
// simulate an HTTP call taking 500ms to complete. Can be deleted.
createDelayedObservable(): Observable<any> {
return of(true)
.pipe(delay(500));
}
// Transforms an observable into a promise to be used with await
createPromiseFromObservable(obs: Observable<any>): Promise<any> {
return obs.toPromise();
}
那这个呢 ?
const callQuery = function() {
return new Promise((resolve, reject) => {
this.httpclient.get(MyUrl).subscribe((response) => {
resolve(response);
});
});
}
const getResult = async function() {
const response = await callQuery();
return response['__zone_symbol__value'];
}