2017-06-15 137 views
0

我正面临来自HTTP请求响应的问题Angular 2。 我正在使用“.subscriber”来获取HTTP请求的响应。异步AJAX响应问题

以下是我写的代码:

NewJobDetailsComponent.ts:

ngOnInit() { 
    this.masterData = this.masterDataS.getMasterData(["designations"]); 
//code breaking at below line 
    this.designations = this.masterData["designations"]; 
} 

MasterDataS.ts:

private masterData = {}; 
private baseUrl = "some URL"; 
getMasterData(keys) { 
    let missingData = []; 
    for (let key of keys) { 
    this.baseAjaxService.doPost(this.baseUrl, missingData) 
     .subscribe(data => { 
       this.masterData[key] = data[key]; 
       this.sessionStorage.setValue(key, data[key]); 
     }); 
    } 
    return this.masterData; 
} 

在上面的代码,我去拿点来自服务器的数据,之后我必须使用结果分配给this.designations。

现在为了使服务通用,我必须在MasterDataS.ts中为这个请求使用.subscriber。因此,我无法在NewJobDetailsComponent.ts中编写.subscriber

但是,由于NewJobDetailsComponent.ts中的代码取决于HTTP请求的结果。我怎样才能以同步方式编写代码,以便在得到HTTP的结果之后,只有下面的语句才会被执行?

this.designations = this.masterData["designations"]; 

这种问题我在大多数情况下只能在这个例子中改变。

+0

[请不要把问题标题标签(https://stackoverflow.com/help/tagging) – Liam

+1

的可能的复制[如何恢复来自异步调用的响应?](https://stackoverflow.com/quest ion/14220321/how-do-i-return-the-an-asynchronous-call) – Liam

+0

@Liam:我在Angular2中特别关注这个问题。以上链接没有与Angular 2相关的任何内容。 – Ricks

回答

-2

您必须重构代码才能实现稳定的异步代码处理。

// javascript Async mixed with Sync code? 

getMasterData(keys) { 
    console.log(1); 

    let missingData = []; 
    for (let key of keys) { 
    console.log(2); 

    this 
    .baseAjaxService 
    .doPost(this.baseUrl, missingData) 
    .subscribe(data => { 
     console.log(3); 

     this.masterData[key] = data[key]; 
     this.sessionStorage.setValue(key, data[key]); 
    }); 
    } 

    console.log(4); 
    return this.masterData; 
} 

// but instead you get 
// 1 
// 2 x keys lenght 
// 4 
// 3 x resolved times 

正如有人问, 这是解决你的问题,但是,请记住,理解异步代码执行的JavaScript中的主要概念之一,所以,我建议你不要复制我的代码,但做自己:

getMasterData(keys) { 

    return Promise 
    .all(
     keys 
     .map(() => (
      this 
      .baseAjaxService 
      .doPost(this.baseUrl, missingData) 
      .toPromise() 
      .then(data => data[key]) 
     )) 
    ) 
    ; 
} 


// Component 

ngOnInit() { 
    this.masterData = this 
    .masterDataS 
    .getMasterData(["designations"]) 
    .then(results => { 
     this.designations = results["designations"] 
     // do whatever you want with this.designations 
    }) 
    ; 
} 
+1

'返回this.masterData;'不起作用。这遭受[同样的问题](https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call)问题确实 – Liam

+0

'this.masterData [ key] = data [key];'将会晚于'this.designations = this.masterData [“designations”];'执行,所以,而不是downwoting ...试着理解事件循环是如何工作的。 – Hitmands

+0

什么?我不知道你想在这里说什么?是的,'this.masterData [key] = data [key];'会比'this.designations = this.masterData [“designations”];'更晚执行,这就是OP的问题。你上面提出的解决方案如何? – Liam