我正在向API服务器发出HTTP发布请求。我有一个函数进行调用,然后根据响应的值返回true或false。但是,当我尝试评估响应时,它是不确定的,因此使我的函数始终返回false。
我考虑过进行while(response == undefined)循环,只是为了等到该值被定义之后才对它求值,但是还有其他解决方案吗?
apiCall(): any{
let headers: HttpHeaders = new HttpHeaders();
headers.append('Content-Type', 'application/json');
var result;
this.http.post(this.url, this.data, {headers: headers}).subscribe(
res => {
result = res;
}
);
return result;
}
evaluate() : boolean {
var response = apiCall();
if(response == 1968){
return true;
}
else return false;
}
我想根据api响应的值从评估函数返回true或false。
答案 0 :(得分:0)
对于Java新手来说,这是一种简单但令人困惑的机制,它是一种单线程异步设计的语言,它使许多方面变得更加容易...
不可能像其他语言那样延迟代码的显式执行。您的代码正在执行的操作是创建结果变量,执行请求,订阅请求,然后立即返回result
变量,该变量仍然为undefined
。
订阅时,您使用速记箭头语法传递callback function。 data => { ... }
与function(data) { ... }
基本相同。
接收到响应后,将执行回调函数,该回调函数将更新变量。但是,这是没有意义的。 result
变量仅在apiCall
函数范围内可用,该函数已经返回,您将更新一个不再使用的变量。
var response = apiCall();
apiCall将立即返回一个空的result
变量。该请求正在后台处理。 while
循环将不起作用,它们将阻塞线程,这意味着它无法处理响应并创建无用的工作。解决方案简单得多,遵守异步逻辑的规则。
我将让您对异步Javascript(回调,promise,async / await)进行一些研究,但是angular使得使用subscribe
模式很容易。在下面,它使用Rxjs
和可观察值。
最简单的方法是遵循docs。您的api调用应从http.post
返回Observable,并且该数据的所有使用者都应订阅该数据,并传入一个函数以供以后执行。
请记住,任何回调很可能不会与其余代码同时执行。将其视为一条链,每个链都导致下一个事件。这就是它的工作方式,应该没有任何交叉。
function apiCall() {
...
return this.http.post("https://...", data, headers);
}
function getData() {
apiCall()
.subscribe(data => {
if (data.response === 200) {
...do something now that the response is known
}
});
}
请记住,出于相同的原因,您无法从getData
返回true / false,它已经返回了。您必须继续限制动作,或者,如果您真的想尝试这种方法,请参见async/await
。
答案 1 :(得分:0)
对于有问题的请求,您可以使用setTimeout()
来解决问题。