如何防止多次调用API?

时间:2017-10-31 15:29:35

标签: javascript promise vuejs2 axios

我有以下功能

$(window).localDatabase('schooldata', schoolId)

返回存储的值,或者如果过时,则调用以下

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。

我想实现一个方法,如果一个请求尚未处理,则不会发出另一个请求:我应该遵循什么逻辑?

1 个答案:

答案 0 :(得分:1)

我认为这应该有效。创造承诺一次,并始终返回相同的承诺。如果已经解决了承诺,则会立即使用已解决的值触发 .then 块。像这样:

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;