我已经阅读了很多东西,并且我理解我的问题可能是许多其他问题的重复,但是我似乎无法找到/理解我找到的任何答案。
我正在尝试创建一个函数,该函数将从异步调用返回后端的响应,而不是promise或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
的键,用于保存我的回复。但是我不知道如何访问它(例如,上面的第二个功能无法按预期运行)。
答案 0 :(得分:0)
您应该使用Observables,因为它们比Promise更加发达。
但是,自您提出要求以来,这里的stackblitz向您展示了如何根据可观察对象创建承诺。
停止自行创建承诺,并依靠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();
}
答案 1 :(得分:0)
我觉得自己的问题得到了最好的解决:
var totalSelectedElements = 0
func select(at: Int) {
ayes[at].selectionCount += 1
totalSelectedElements += 1
}
func deselect(at: Int) {
ayes[at].selectionCount -= 1
totalSelectedElements -= 1
}
答案 2 :(得分:-1)
这是什么?
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'];
}