如何解决角度/打字稿中HTTP请求对api服务器的响应延迟?

时间:2019-07-09 14:16:26

标签: angular typescript http web-applications

我正在向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。

2 个答案:

答案 0 :(得分:0)

对于Java新手来说,这是一种简单但令人困惑的机制,它是一种单线程异步设计的语言,它使许多方面变得更加容易...

不可能像其他语言那样延迟代码的显式执行。您的代码正在执行的操作是创建结果变量,执行请求,订阅请求,然后立即返回result变量,该变量仍然为undefined

订阅时,您使用速记箭头语法传递callback functiondata => { ... }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()来解决问题。