Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何防止多次调用API?_Javascript_Promise_Vuejs2_Axios - Fatal编程技术网

Javascript 如何防止多次调用API?

Javascript 如何防止多次调用API?,javascript,promise,vuejs2,axios,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(re

我有以下功能

$(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组件需要数据库和启动时调用多次我粘贴的承诺


我想实现一种方法,如果一个请求已经挂起,它不会发出另一个请求:我应该遵循什么逻辑?

我认为这应该可行。创建一次承诺,并始终返回相同的承诺。如果已解析承诺,则立即使用已解析的值触发.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;

有趣的解决方案。在整个代码中,this.promise是否应该是唯一的?如果承诺已经解决,它会再次运行吗?我添加了一行代码,将修复我正在寻找的内容。非常感谢。