如何防止多次调用 API?
How can I prevent calling the API multiple times?
我有以下功能
$(window).localDatabase('schooldata', schoolId)
其中 returns 一个存储值,或者如果已过时,则调用以下内容
return new Promise(function(resolve, reject){
console.log('Downloading school database');
axios.get('/api/school-database/'+schoolId+'/schooldata')
.then(response => {
$(window).storage(
'planner',
'save',
'schooldata-'+schoolId,
[response.data]
).then(function(response2){
resolve(response.data);
saveLastUpdate('schooldata-'+schoolId).then(function(response2){
triggerOnVueBus('db-updated:schooldata');
});
});
});
});
代码运行完美,除了我有许多 Vue 组件需要数据库并且在启动时多次调用我粘贴的 Promise。
我想实现一种方法,如果一个请求已经挂起,则不会发出另一个请求:我应该遵循什么逻辑?
我认为这应该可行。创建承诺一次,始终 return 相同的承诺。如果一个 promise 已经被 resolve,.then 块会立即被 resolved 值触发。像这样:
if (!this.promise) {
this.promise = new Promise(function(resolve, reject) {
console.log('Downloading school database');
axios.get('/api/school-database/' + schoolId + '/schooldata')
.then(response => {
$(window).storage(
'planner',
'save',
'schooldata-' + schoolId, [response.data]
).then(function(response2) {
resolve(response.data);
saveLastUpdate('schooldata-' + schoolId).then(function(response2) {
triggerOnVueBus('db-updated:schooldata');
});
});
});
});
}
return this.promise;
我有以下功能
$(window).localDatabase('schooldata', schoolId)
其中 returns 一个存储值,或者如果已过时,则调用以下内容
return new Promise(function(resolve, reject){
console.log('Downloading school database');
axios.get('/api/school-database/'+schoolId+'/schooldata')
.then(response => {
$(window).storage(
'planner',
'save',
'schooldata-'+schoolId,
[response.data]
).then(function(response2){
resolve(response.data);
saveLastUpdate('schooldata-'+schoolId).then(function(response2){
triggerOnVueBus('db-updated:schooldata');
});
});
});
});
代码运行完美,除了我有许多 Vue 组件需要数据库并且在启动时多次调用我粘贴的 Promise。
我想实现一种方法,如果一个请求已经挂起,则不会发出另一个请求:我应该遵循什么逻辑?
我认为这应该可行。创建承诺一次,始终 return 相同的承诺。如果一个 promise 已经被 resolve,.then 块会立即被 resolved 值触发。像这样:
if (!this.promise) {
this.promise = new Promise(function(resolve, reject) {
console.log('Downloading school database');
axios.get('/api/school-database/' + schoolId + '/schooldata')
.then(response => {
$(window).storage(
'planner',
'save',
'schooldata-' + schoolId, [response.data]
).then(function(response2) {
resolve(response.data);
saveLastUpdate('schooldata-' + schoolId).then(function(response2) {
triggerOnVueBus('db-updated:schooldata');
});
});
});
});
}
return this.promise;