异步 AJAX 响应问题
Asynchronous AJAX Response Issue
我在 Angular 2 中遇到 HTTP 请求的响应问题。
我正在使用“.subscriber”来获取 HTTP 请求的响应。
以下是我写的代码:
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"];
我在大多数情况下遇到的这种问题只是示例发生了变化。
您必须重构代码才能实现稳定的异步代码处理。
// 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
})
;
}
我在 Angular 2 中遇到 HTTP 请求的响应问题。 我正在使用“.subscriber”来获取 HTTP 请求的响应。
以下是我写的代码:
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"];
我在大多数情况下遇到的这种问题只是示例发生了变化。
您必须重构代码才能实现稳定的异步代码处理。
// 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
})
;
}