Экспорт Promise API требует повторного использования - PullRequest
0 голосов
/ 12 октября 2018

Мой вопрос о нераспознанном поведении приложения реагирования.Я написал обещания для вызовов API и экспортировал их в один файл, так как многие компоненты будут их использовать.Проблема в том, что эти экспортированные вызовы выполняются еще до того, как я вызываю их при загрузке приложения.

//in commonAPI.js with other exports of similar promises
export var loadDesignationTypes = new Promise(function (resolve, reject) {

    axios.get('http://localhost:7002/commonAPI/getDesignations')
        .then(response => {
            if (response.data.success) {
                var designationObjAr = response.data.resultEmployeeDesignations;
                resolve(designationObjAr);
            }
        }).catch(function (error) {
            console.log("designation err " + error);
            reject(error)
        });
});

Внутренние компоненты:

import { loadDesignationTypes, loadDepartmentTypes,
          loadLocationTypes, loadMaritialStatus } from '../../../CommonAPIs';

 //in a function
 const results = await Promise.all([loadDesignationTypes,
            loadDepartmentTypes,loadLocationTypes, loadMaritialStatus]);

Что меня еще больше смущает, так это то, что другие экспорты обещаний, которыене вызывается внутри компонента, который находится в том же файле с вызванным обещанием, также выполняются.

1 Ответ

0 голосов
/ 12 октября 2018

Модуль в настоящее время выполняет new Promise(.. блок синхронно , когда выполняется код модуля, в то время как интерпретатор пытается выяснить, что каждый модуль импортирует и экспортирует.Если вы хотите, чтобы axios.get запускался по требованию, а не автоматически, вы должны экспортировать функцию , которая создает Promise при вызове, а не просто Promise.

Вам также следует позаботиться о том, чтобы не использовать явный антипаттерн явного построения Promise - просто вместо этого верните цепочку Promise:

export var loadDesignationTypes = () => axios.get('http://localhost:7002/commonAPI/getDesignations')
  .then(response => {
    if (response.data.success) {
      return response.data.resultEmployeeDesignations;
    }
    // if not successful, you probably want to throw an error:
    throw new Error('Not successful');
  }).catch(function (error) {
    // If this console.log statement isn't necessary,
    // better to leave the catch out entirely
    // and leave error handling to the consumer
    console.log("designation err " + error);
    throw error;
  });

Затем в модуле-потребителе call функция при использовании с Promise.all:

const results = await Promise.all([
  loadDesignationTypes(),
  // etc
...