如何处理来自慢速服务器的响应

时间:2019-03-26 04:58:06

标签: angular ionic-framework ionic3 angular5 angular7

我必须从服务器获取一些数据。服务器的响应非常缓慢。我想将响应存储在一个数组中,以便它可以显示在template中。目的是将响应存储到数组中直到服务器返回响应为止。

我已经尝试过setTimeout(),但是失败了

Ts文件

ticketdetails()
{
  this.funName = 'online_service';
  var url = { url:'bookingdetails?username=....&password=....&bookingCode=' + this.id};
  console.log(url);
  this.myservice.online_service(this.funName,url).subscribe(response => {

 if (response.code === '1') 
   {
     this.bookDetails = response;
     console.log('Book details inside function', this.bookDetails);
   }
  })
  console.log('Book details outside function' , this.bookDetails)
}

在控制台中, 内部书详细信息显示来自服务器的响应结果 但, 功能外的书籍详细信息显示为null。

3 个答案:

答案 0 :(得分:0)

由于JavaScript / TypeScript具有异步性质,因此您无法处理- (AWSTask<AWSCognitoIdentityUserSession *> *)getSession:(NSString *)username password:(NSString *)password validationData:(nullable NSArray<AWSCognitoIdentityUserAttributeType *> *)validationData; 之外的返回可观察对象。您必须访问该订阅块中返回的可观察值:

self.user.getSession(username, password:password).continueWithBlock(block: { (result) -> Any? in
       if let idToken = result.result?.idToken{
           //YOU HAVE THE TOKEN
           if self.user?.isSignedIn ?? false{
               print("user finally signed in")
           }
           else{
               print("something weird happened")
           }
       }
})

在模板上,如果您不希望在控制台上打印任何错误(或更糟糕的是,在模板视图本身上),则可以通过在{{1 }},以防止在等待呈现数据(当时尚未定义)时将其从null或未定义的值中删除:

subscribe()

或者,您可以使用* ngIf,它会阻止在定义this.myservice.online_service(this.funName,url).subscribe(response => { if (response.code === '1') { this.bookDetails = response; console.log(response) //prints the array or object } }); console.log(this.bookDetails) //this will probably print undefined 之前呈现该div。

bookingDetails

答案 1 :(得分:0)

var mymap = L.map('YOUR_MAP_ID').on('load', onMapLoad).setView([51.505, -0.09], 13);

function onMapLoad(){
  console.log("map loaded");
}

答案 2 :(得分:0)

我认为您应该在函数调用的回调中执行所有操作/赋值。 由于调用将是异步的,因此,直到您没有收到服务器的响应,您的其他代码才会被执行。

API调用后的代码将被执行,因此我认为API调用的设计应将其响应包装在回调中,然后再使用。 在API调用之后编写的代码将在该行之后立即执行,因为Java脚本具有明显的本质,因此它不会等待响应到达。

示例:其他服务

customHttpDefaultOptions= {
     headers: new HttpHeaders({
             'Content-Type': 'application/json'
     })
};

postRestCall(requestBody, data) {
    this.httpClient.post(apiURL, requestBody, this.customHttpDefaultOptions).pipe(retry(1))
            .subscribe(response => {
            data(response);
    }, error => data(this.handleError(error)));
}

因此,在这里您还应该做一些事情,一旦响应到达,它将被包装在回调中,您以后可以在回调中使用它。

示例:

this.restService.postRestCall(requestBody, data => {
    this.his.bookDetails = data;
});

因此,如果您提供了某种形式的休息服务,那么您还可以重用API调用机制,而不用编写api调用的样板代码。

这根本不是慢的问题。