我正在使用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()”中。那是一种好的代码风格吗?
将不胜感激!
答案 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)
您可能会在功能上使用更多的声明性名称。