Ionic 4 http.get.subscribe 不存储值
Ionic 4 http.get.subscribe doesn't store value
所以这可能是重复的或者什么的,但到目前为止我找不到任何简单明了的东西,所以我只是想问一下。
我有一些简单的代码如下:
fetchData() {
let dataArray: Array<any> = [,,,];
this.prepareDataRequest()
.subscribe(data => {
this.dataArray[0] = JSON.parse(JSON.stringify(data["results"]));
this.dataArray[1] = Object.keys(JSON.parse(JSON.stringify(data["results"]))).length;
console.log(this.dataArray[0]);
},
err => {
this.dataArray[2] = `Error --> Status: ${err.status}, Message: ${err.statusText}`;
});
return this.dataArray;
}
prepareDataRequest() {
const dataUrl = 'https://randomuser.me/api/?results=10&inc=gender,name,nat,email,phone,id';
return this.http.get(dataUrl);
}
console.log(this.dataArray[0]);
完美运行,但 return 是空的。到目前为止,我发现这是因为它在获取项目之前执行 return this.dataArray;
。
但是我该如何解决呢? 'wait for everything to be stored before you return' 有简单的表达方式吗?还是我这样做完全错误(可能是 xD)?
我已经尝试了一些异步和其他东西,但我对此有点陌生,所以并不顺利。
你做错了,你需要return一个可观察的:
fetchData() {
return this.prepareDataRequest().pipe(
pluck('results'),
catchError(err => `Error --> Status: ${err.status}, Message: ${err.statusText}`),
);
}
someConsumerFunction() {
fetchData().pipe(
// do optional processing here
).subscribe(
results => console.log(results),
err => console.log(err),
);
}
或者如果您想等待完成并使用异步和 Promise:
async fetchData() {
try {
const data = await this.prepareDataRequest().pipe(
first(),
).toPromise();
return data.results;
} catch (err) {
return `Error --> Status: ${err.status}, Message: ${err.statusText}`;
}
}
但第一种方法更好,因为您可以更灵活地在消费者端处理数据。
您正在订阅范围之外返回结果,因此 dataArray 尚未初始化。
您需要这样更改您的 fetchData() 方法:
fetchData() {
let dataArray: Array<any> = [, , ,];
this.prepareDataRequest()
.subscribe(data => {
this.dataArray[0] = JSON.parse(JSON.stringify(data["results"]));
this.dataArray[1] = Object.keys(JSON.parse(JSON.stringify(data["results"]))).length;
console.log(this.dataArray[0]);
// return your dataArray here
return this.dataArray;
},
err => {
this.dataArray[2] = `Error --> Status: ${err.status}, Message: ${err.statusText}`;
});
}
此外,当您只使用 dataArray 字段时,我对 dataArray 局部变量的声明感到有点困惑。也许那里不需要。
所以这可能是重复的或者什么的,但到目前为止我找不到任何简单明了的东西,所以我只是想问一下。
我有一些简单的代码如下:
fetchData() {
let dataArray: Array<any> = [,,,];
this.prepareDataRequest()
.subscribe(data => {
this.dataArray[0] = JSON.parse(JSON.stringify(data["results"]));
this.dataArray[1] = Object.keys(JSON.parse(JSON.stringify(data["results"]))).length;
console.log(this.dataArray[0]);
},
err => {
this.dataArray[2] = `Error --> Status: ${err.status}, Message: ${err.statusText}`;
});
return this.dataArray;
}
prepareDataRequest() {
const dataUrl = 'https://randomuser.me/api/?results=10&inc=gender,name,nat,email,phone,id';
return this.http.get(dataUrl);
}
console.log(this.dataArray[0]);
完美运行,但 return 是空的。到目前为止,我发现这是因为它在获取项目之前执行 return this.dataArray;
。
但是我该如何解决呢? 'wait for everything to be stored before you return' 有简单的表达方式吗?还是我这样做完全错误(可能是 xD)?
我已经尝试了一些异步和其他东西,但我对此有点陌生,所以并不顺利。
你做错了,你需要return一个可观察的:
fetchData() {
return this.prepareDataRequest().pipe(
pluck('results'),
catchError(err => `Error --> Status: ${err.status}, Message: ${err.statusText}`),
);
}
someConsumerFunction() {
fetchData().pipe(
// do optional processing here
).subscribe(
results => console.log(results),
err => console.log(err),
);
}
或者如果您想等待完成并使用异步和 Promise:
async fetchData() {
try {
const data = await this.prepareDataRequest().pipe(
first(),
).toPromise();
return data.results;
} catch (err) {
return `Error --> Status: ${err.status}, Message: ${err.statusText}`;
}
}
但第一种方法更好,因为您可以更灵活地在消费者端处理数据。
您正在订阅范围之外返回结果,因此 dataArray 尚未初始化。
您需要这样更改您的 fetchData() 方法:
fetchData() {
let dataArray: Array<any> = [, , ,];
this.prepareDataRequest()
.subscribe(data => {
this.dataArray[0] = JSON.parse(JSON.stringify(data["results"]));
this.dataArray[1] = Object.keys(JSON.parse(JSON.stringify(data["results"]))).length;
console.log(this.dataArray[0]);
// return your dataArray here
return this.dataArray;
},
err => {
this.dataArray[2] = `Error --> Status: ${err.status}, Message: ${err.statusText}`;
});
}
此外,当您只使用 dataArray 字段时,我对 dataArray 局部变量的声明感到有点困惑。也许那里不需要。