创建需要相互依赖执行两个嵌套的rest调用的服务函数的最佳,最简洁的方法是什么?

时间:2019-06-26 14:26:34

标签: angularjs rest promise

我正在使用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 个答案:

答案 0 :(得分:1)

在链接诺言时,请避免在.then方法之外对变量进行变异。

  

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)
    });
}

该代码具有关闭问题的风险。如果在上一个链接的XHR完成之前多次调用getB函数,则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);
    });
}

答案 1 :(得分:0)

我不熟悉您提到的样式指南,但总的来说,我倾向于这样做:

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()s的函数,以便最终获得漂亮的干净的Promise管道。像这样

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)

您可能会在功能上使用更多的声明性名称。