Каков наилучший и наиболее чистый способ создания сервисной функции, которая должна выполнять два вложенных вызова покоя в зависимости друг от друга? - PullRequest
0 голосов
/ 26 июня 2019

Я использую Todd Mottos и John Papas Styleguide и хорошо знаком с обоими. Сейчас я пытаюсь создать службу данных с функцией, которая должна выполнять два вложенных REST-вызова, второе зависит от первого. что будет лучшим и самым чистым способом для достижения этой цели?

Я написал три функции:

[...]
return {
    get: get
};  

var benutzerkennung = {};


// API function
function get(referenzID, versorgungsfallIdent) {
    return getBenutzerkennung()
        .then(function() {
            return getMasterData(referenzID, versorgungsfallIdent);
        })
        .catch(requestFailed);
}

function getBenutzerkennung() {
    return commonQueryService
        .requestBenutzerkennung()
        .then(function(response) {
            benutzerkennung = response.data.reference;
        });
}

function getMasterData(referenzID, versorgungsfallIdent) {
    // "data" is just a simple js-object filled with the three params, two coming 
    // from the controller calling .save() and one coming from the first request 
    var data = getFilledDataObject(benutzerkennung, referenzID, versorgungsfallIdent);

    return $http
        .post('./services/anStammdatenService/get/getANStammdaten', data)
            .then(function (response) {
                return response.data;
            });
}

так что вы видите, что Service-Method для вызова из контроллера -

функция сохранения ()

и выполняет первый запрос, заключенный в функцию " getBenutzerkennung () ", которая требуется для следующего запроса, заключенную в " getMasterData () ". Это хороший стиль кода?

Буду очень признателен!

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Избегайте мутирующих переменных вне метода .then при связывании обещаний.

BAD

var outside;

function getA (params){
    return serviceA(params).then(function(response) {
        outside = response.data;
    });
}

function getB (params){
    return getA(params).then(function() {
         return serviceB(params,outside)
    });
}

Код может вызвать проблемы с закрытием.Если функция getB вызывается несколько раз до завершения предыдущих цепочек XHR, переменная outside может быть установлена ​​неправильно.

Данные цепочки правильно

function getA (params){
    return serviceA(params).then(function(response) {
        return response.data;
    });
}

function getB (params){
    return getA(params).then(function(dataA) {
         return serviceB(params,dataA);
    });
}
0 голосов
/ 27 июня 2019

Я не знаком с упомянутыми вами руководствами по стилю, но в целом я хотел бы сделать что-то вроде этого:

const get = () => commonQueryService
  .requestBenutzerkennung()
  .then(function(response) {
      return response.data.reference;
  })
  .then(function(benutzerkennung){
    var data = getFilledDataObject(benutzerkennung, referenzID, versorgungsfallIdent);
    return $http.post('./services/anStammdatenService/get/getANStammdaten', data)

  })
  .then(function (response) {
      return response.data;
  })

Если хотите, вы можете извлечь функции, которые вы передаете в .then (), так что в конце вы получите хороший чистый конвейер обещаний.Примерно так:

const getData = function(response) {
  return response.data.reference;
}

const postData = function(benutzerkennung){
  var data = getFilledDataObject(benutzerkennung, referenzID, versorgungsfallIdent);
  return $http.post('./services/anStammdatenService/get/getANStammdaten', data)   
}

const sendResponse = function (response) {
  return response.data;
}

const get = () => commonQueryService
  .requestBenutzerkennung()
  .then(getData)
  .then(postData)
  .then(sendResponse)

Вы можете использовать другие декларативные имена для своих функций.

...