如何使用承诺发送多个不同的请求,并让所有请求一个接一个地运行?

klsxnrf1  于 2021-09-13  发布在  Java
关注(0)|答案(0)|浏览(221)

我使用这个脚本从api导入一些数据,并将其导入数据库。由于此过程非常耗时,它经常超时,因为在某些处理的项目上有大量数据要处理。。
不久前,我提出了这个解决方案,使用Promissions,首先向api发出请求,然后在请求完成后,我将准备数据并将其放入一个临时csv文件,然后我将发出另一个请求,将该文件拆分为多个较小的文件,然后。。。你明白了。。。这是工作,但我需要添加一些额外的要求,我只是不能让它工作。。。我可能只需要简化我的逻辑。
有谁能帮我改进这段代码,让我更容易添加这些额外的请求,并让它一个接一个地发送请求?
这是有问题的(过于简化的)脚本:

window.importTrialsScripts = {};

window.addEventListener('DOMContentLoaded', function() {
  importTrialsScripts.app.initialize();
});

(function(importTrialsScripts, document, $) {
  importTrialsScripts = importTrialsScripts || {};

  const app = {
    ajaxurl: 'myajaxurl',

    initialize: function() {
      this.submitHandler();
    },

    submitHandler: function() {
      const self = this;

      document.querySelector('#start-import').addEventListener('click', function() {
        self.pullTrialsFromApi();
      });
    },

    pullTrialsFromApi: function() {
      let data = new FormData();
      data.append('action', 'pull_trials_from_api');

      [123, 456, 789].forEach(function(str) {
        data.append('ids[]', str);
      });

      this.startPullingTrials(data);
    },

    startPullingTrials: function(data) {
      const self = this;

      let promise = new Promise(function(resolve, reject) {
        self.sendAjaxRequest(data, function() {
          if (this.status === 200) {
            const response = JSON.parse(this.response);

            if (! response.success) {
              alert('The API could not be reached. Please try again.');
              console.error('Error!!', response);
              return;
            }

            resolve(response.data);
          }
          else {
            console.error('there was an error in the request', this);
            reject(this);
          }
        });
      });

      promise.then(function(chunks) {
        const processingChunks = Object.values(chunks).map(function(chunk) {
          return self.processChunk(chunk);
        });

        Promise.all(processingChunks).then(function (processedTrials) {
          console.log('finished', processedTrials);
        });
      }, function(err) {
        console.error('promise rejected', err);
      });
    },

    processChunk: function(chunkTrials) {
      const self = this;

      let data = new FormData();
      data.append('action', 'process_trials_chunk');

      Object.values(chunkTrials).forEach(function(chunk) {
        data.append('chunk[]', JSON.stringify(chunk));
      });

      return new Promise(function(resolve, reject) {
        self.sendAjaxRequest(data, function() {
          if (this.status === 200) {
            const response = JSON.parse(this.response);

            if (! response.success) {
              console.error('Error!!', response.data);
              return;
            }

            resolve(response.data);
          }
          else {
            console.log('there was an error in the request', this);
            reject(this);
          }
        });
      });
    },

    splitToMultipleFiles: function() {
      const self = this;

      const data = new FormData();
      data.append('action', 'split_location_files');

      return new Promise(function(resolve, reject) {
        self.sendAjaxRequest(data, function() {
          if (this.status === 200) {
            const response = JSON.parse(this.response);

            if ( ! response.success ) {
              console.error('Error!!', response.data);
              return;
            }

            resolve(response.data.files);
          }
          else {
            console.log('there was an error in the request', this);
            reject(this);
          }
        });
      });
    },

    processLocation: function(file) {
      const self = this;

      let data = new FormData();
      data.append('action', 'process_location_data');
      data.append('file', file);

      return new Promise(function(resolve, reject) {
        self.sendAjaxRequest(data, function() {
          if ( this.status === 200 ) {
            const response = JSON.parse(this.response);

            if (! response.success) {
              console.error('Error!!', response.data);
              return;
            }

            resolve(response.data);
          }
          else {
            console.log('there was an error in the request', this);
            reject(this);
          }
        });
      });
    },

    sendAjaxRequest: function(data, callback) {
      const self = this;

      let xhr = new XMLHttpRequest();
      xhr.open('POST', ajaxurl);

      xhr.onload = callback;

      xhr.addEventListener('timeout', function(e) {
        console.error('the request has timed out', e);
      });

      xhr.addEventListener('error', function(e) {
        console.error('the request returned an error', e);
      });

      xhr.addEventListener('abort', function(e) {
        console.error('the request was aborted', e);
      });

      xhr.send(data);
    },
  };

  $.extend(importTrialsScripts, {
    app: app
  });

}).apply(this, [window.importTrialsScripts, document, jQuery]);

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题