потенциально рефакторинг кода для использования связанных обещаний - PullRequest
0 голосов
/ 07 сентября 2018

Следующий код работает нормально, но, похоже, должен быть более краткий способ его написания. Я искал примеры цепочечных обещаний, но не нашел ничего достаточно близкого к этой логике, чтобы выяснить, как выполнить преобразование из этого в цепочечный подход. Можно ли это сделать?

var vm = this;

accountingAppService.getInvoiceTypes().then(function (result) {
    vm.invoiceTypes = result;
}, function (e) {
    onError(e);
});

accountingAppService.getReceivablesTypes().then(function (result) {
    vm.receivablesTypes = result;
}, function (e) {
    onError(e);
});

accountingAppService.getGeneralLedgerAccounts().then(function (result) {
    vm.generalLedgerAccounts = result;
}, function (e) {
    onError(e);
});

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Использовать array.forEach и средства доступа к свойствам :

var getList = ["invoiceTypes","receivableTypes","generalLedgerAccounts"];

getList.forEach(x => getGeneric(x));

function getGeneric(name) {
    var capName = name[0].toUpperCase() + name.slice(1);
    var getFn = accountingAppService["get"+capName];
    getFn().then(function(result) {
        vm[name] = result;
    }, function (e) {
        onError(e);
    });
} 
0 голосов
/ 08 сентября 2018

Цепочка этих вызовов вызовет их выполнение после другого. И, судя по всему, ваш код не является необходимым. Что вы можете сделать, так это сгруппировать их.

Promise.all([
  accountingAppService.getInvoiceTypes(),
  accountingAppService.getReceivablesTypes(),
  accountingAppService.getGeneralLedgerAccounts()
]).then(function (results) {
 vm.invoiceTypes = results[0];
 vm.receivablesTypes = results[1];
 vm.generalLedgerAccounts [2];
}).catch(onError);

Похоже, вы избавились от некоторого кода. Вы даже можете использовать деструктуризацию и асинхронное / ожидание, чтобы сделать его еще чище.

...