我有一个问题,我知道这不是很具挑战性。但出于某种原因,我很难找到一个好的解决方案。我需要从URL获取数据。但是,URL本身是从另一个端点获取的。所以,首先我从服务器获取包含URL的对象。获取URL后,我访问获取的URL,最终为我提供了所需的数据。数据包含我最终必须获取的其他URL。如何从ember路径的模型钩子中获取所有这些数据?
model(params) {
let futureData = new Ember.RSVP.Promise((resolve,reject) => {
api.ajaxGet(
`${api.buildV3EnterpriseUrl('reports')}` + '/' + params.report_id
).then(function (successVal) {
resolve(successVal);
}, function (error) {
reject(error);
});
});
futureData.then((success) => {
return
api.xmlRequest('GET',success.aggregationUrls.elements[0].url);
})
return Ember.RSVP.hash({
reportData: futureData
});
}
答案 0 :(得分:0)
你只忘了一点:
then
在futureData
承诺上调用model(params) {
const futureData = api.ajaxGet(`${api.buildV3EnterpriseUrl('reports')}/${params.report_id}`);
const futureReportData = futureData.then(success => {
return api.xmlRequest('GET',success.aggregationUrls.elements[0].url);
});
return Ember.RSVP.hash({
reportData: futureReportData
});
}
并不会改变它,它会为回调结果返回一个新的承诺。你忽略了那个回报值。
然后,在修复Promise
constructor antipattern之后,它看起来像这样:
model(params) {
return api.ajaxGet(api.buildV3EnterpriseUrl('reports') + '/' + params.report_id)
.then(success => api.xmlRequest('GET',success.aggregationUrls.elements[0].url))
.then(reportData => ({reportData}));
}
也可以缩短为
function convert(original) {
var tmp = {};
for(var tableIndex in original) {
var tableObj = original[tableIndex];
for(var colKey in tableObj.data) {
var col = tableObj.data[colKey];
if(tmp[colKey] === undefined) {
tmp[colKey] = {name: colKey};
}
tmp[colKey][tableObj.table] = col
}
}
var output = [];
for(var index in tmp) {
output.push(tmp[index]);
}
return output;
}
var original = [
{table:"a1", data: {colA:1,colB:2,colC:3}},
{table:"a2", data: {colA:2,colB:3,colC:4}},
{table:"a3", data: {colA:3,colB:4,colC:5}}
]
console.log(convert(original));