恩伯连锁承诺

时间:2017-05-10 19:08:39

标签: javascript ember.js promise

我有一个问题,我知道这不是很具挑战性。但出于某种原因,我很难找到一个好的解决方案。我需要从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
});

}

1 个答案:

答案 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));