vue中如何提前从axios下载数据?
how to download data from axios in advance in vue?
在我的应用程序中,我需要 运行 我的应用程序离线,因为司机必须使用该应用程序,而在偏远地区,他们可能找不到为此目的的互联网我需要通过 Axios 提前下载所有数据在他们有互联网时请求。这样请求就可以从缓存而不是服务器中获取数据。
目前我试过了,但这似乎不是一个好习惯
tryOffileWorkSheet: async function () {
Network.addListener("networkStatusChange", (status) => {
if (status.connected) {
setInterval(function () {
let worksheet = JSON.parse(localStorage.getItem("worksheet"));
if (worksheet == null) {
worksheet = [];
}
// localStorage.removeItem('worksheet')
for (let i = 0; i <= worksheet.length; i++) {
if(worksheet.length > 0){
setTimeout(function () {
if(worksheet[i]?.work_order_id){
ApiService.get(
`/api/gangBoss/work-sheet/${worksheet[i].work_order_id}/${worksheet[i].column_name}/${worksheet[i].value}`
).then((response) => {
if(response.data.status){
worksheet.splice(i,1)
localStorage.setItem("worksheet", JSON.stringify(worksheet));
}
console.log('After', worksheet)
// this.closeModal();
});
}
},i* 3000);
}
}
}, 3000);
}
});
},
同样为此,用户有必要在互联网可用时在此页面上进行操作,这意味着我们需要下载大量数据。
你能告诉我这样做的最佳实践或 vue 插件可以帮助吗
这个问题有点不清楚,可能不是最适合的,但我会尽力回答。
我在这里首先注意到的是setInterval
的使用,不是你在使用它,而是如何使用它。没有什么可以阻止 运行 的间隔。这是我希望能说明问题的场景
- networkStatusChange 已触发:
status.connected === true
- setInterval 创建间隔#1
- 3 秒后间隔 #1 触发
- ...在接下来的 2 小时内一直发生这种情况
- networkStatusChange 已触发:
status.connected === false
- ...间隔#1 持续发射
- networkStatusChange 已触发:
status.connected === true
- setInterval 创建间隔 #2
- 3 秒内间隔 #1 触发
- 3 秒后间隔 #2 触发
- ... 间隔#1 和#2 持续发射(两次 在 3 秒内)
- networkStatusChange 已触发:
status.connected === false
- networkStatusChange 已触发:
status.connected === true
- setInterval 创建间隔 #3
- 3 秒内间隔 #1 触发
- 3 秒间隔内 #2 触发
- 3 秒后间隔 #3 触发
- ... 间隔#1、#2 和#3 持续发射(三个 在 3 秒内)
所以有两个问题。无论系统是否仍然连接,间隔都会持续触发。
您最好使用单个计时器每 3 秒触发一次,并在连接不可用时退出。这也允许使用 window.navigator.onLine
,它有更好的浏览器支持。
我不知道你希望 worksheet
多长时间,但是如果你通过 setTimeout
3 秒间隔调用 ApiService,然后每 3 秒调用一次父函数,你将发送大量请求。
tryOffileWorkSheet: function () {
// (need to create `intervalId` in data)
if (this.intervalId) clearInterval(this.intervalId);
this.intervalId = setInterval(() => {
if (window.navigator.onLine) {
this.getWorkSheet();
}
}, 3000);
},
getWorkSheet: function () {
let worksheet = JSON.parse(localStorage.getItem("worksheet"));
if (worksheet == null) {
worksheet = [];
}
for (let i = 0; i <= worksheet.length; i++) {
if (worksheet.length > 0) {
setTimeout(() => {
if (worksheet[i]?.work_order_id) {
ApiService.get(
`/api/gangBoss/work-sheet/${worksheet[i].work_order_id}/${worksheet[i].column_name}/${worksheet[i].value}`
).then((response) => {
if (response.data.status) {
worksheet.splice(i, 1);
localStorage.setItem("worksheet", JSON.stringify(worksheet));
}
console.log("After", worksheet);
});
}
}, i * 300);
}
}
},
在我的应用程序中,我需要 运行 我的应用程序离线,因为司机必须使用该应用程序,而在偏远地区,他们可能找不到为此目的的互联网我需要通过 Axios 提前下载所有数据在他们有互联网时请求。这样请求就可以从缓存而不是服务器中获取数据。
目前我试过了,但这似乎不是一个好习惯
tryOffileWorkSheet: async function () {
Network.addListener("networkStatusChange", (status) => {
if (status.connected) {
setInterval(function () {
let worksheet = JSON.parse(localStorage.getItem("worksheet"));
if (worksheet == null) {
worksheet = [];
}
// localStorage.removeItem('worksheet')
for (let i = 0; i <= worksheet.length; i++) {
if(worksheet.length > 0){
setTimeout(function () {
if(worksheet[i]?.work_order_id){
ApiService.get(
`/api/gangBoss/work-sheet/${worksheet[i].work_order_id}/${worksheet[i].column_name}/${worksheet[i].value}`
).then((response) => {
if(response.data.status){
worksheet.splice(i,1)
localStorage.setItem("worksheet", JSON.stringify(worksheet));
}
console.log('After', worksheet)
// this.closeModal();
});
}
},i* 3000);
}
}
}, 3000);
}
});
},
同样为此,用户有必要在互联网可用时在此页面上进行操作,这意味着我们需要下载大量数据。
你能告诉我这样做的最佳实践或 vue 插件可以帮助吗
这个问题有点不清楚,可能不是最适合的,但我会尽力回答。
我在这里首先注意到的是setInterval
的使用,不是你在使用它,而是如何使用它。没有什么可以阻止 运行 的间隔。这是我希望能说明问题的场景
- networkStatusChange 已触发:
status.connected === true
- setInterval 创建间隔#1
- 3 秒后间隔 #1 触发
- ...在接下来的 2 小时内一直发生这种情况
- networkStatusChange 已触发:
status.connected === false
- ...间隔#1 持续发射
- networkStatusChange 已触发:
status.connected === true
- setInterval 创建间隔 #2
- 3 秒内间隔 #1 触发
- 3 秒后间隔 #2 触发
- ... 间隔#1 和#2 持续发射(两次 在 3 秒内)
- networkStatusChange 已触发:
status.connected === false
- networkStatusChange 已触发:
status.connected === true
- setInterval 创建间隔 #3
- 3 秒内间隔 #1 触发
- 3 秒间隔内 #2 触发
- 3 秒后间隔 #3 触发
- ... 间隔#1、#2 和#3 持续发射(三个 在 3 秒内)
所以有两个问题。无论系统是否仍然连接,间隔都会持续触发。
您最好使用单个计时器每 3 秒触发一次,并在连接不可用时退出。这也允许使用 window.navigator.onLine
,它有更好的浏览器支持。
我不知道你希望 worksheet
多长时间,但是如果你通过 setTimeout
3 秒间隔调用 ApiService,然后每 3 秒调用一次父函数,你将发送大量请求。
tryOffileWorkSheet: function () {
// (need to create `intervalId` in data)
if (this.intervalId) clearInterval(this.intervalId);
this.intervalId = setInterval(() => {
if (window.navigator.onLine) {
this.getWorkSheet();
}
}, 3000);
},
getWorkSheet: function () {
let worksheet = JSON.parse(localStorage.getItem("worksheet"));
if (worksheet == null) {
worksheet = [];
}
for (let i = 0; i <= worksheet.length; i++) {
if (worksheet.length > 0) {
setTimeout(() => {
if (worksheet[i]?.work_order_id) {
ApiService.get(
`/api/gangBoss/work-sheet/${worksheet[i].work_order_id}/${worksheet[i].column_name}/${worksheet[i].value}`
).then((response) => {
if (response.data.status) {
worksheet.splice(i, 1);
localStorage.setItem("worksheet", JSON.stringify(worksheet));
}
console.log("After", worksheet);
});
}
}, i * 300);
}
}
},