Создайте массив обещаний в $ q.all () из значений строки объекта json - PullRequest
0 голосов
/ 10 июля 2019

У меня есть набор функций, которые загружаются через сервисы, которые должны выполняться из $q.all([funcA(),funcB(),funcC()]).И затем у меня есть файл JSON, который сообщает сценарию, какие службы для обработки.У меня проблема с получением значения json для сохранения в массив, который можно передать в $q.all(doFuncs).then, где значения массива будут обрабатываться как функции.

Функции, как упоминалось,загружается с разных сервисов.Технически, каждая функция - это обещание, но для простоты я заявляю их здесь как функцию:

function funcA() {
 // do something
}
function funcB() {
 // do something
}
function funcC() {
  // do something
}

Файл json, который динамически загружается с удаленного сервера, позволит мне включать / выключать разных поставщиков дляобрабатываться по мере необходимости:

json:

var vendorObj = { 
   "vendorA" : {
      "cName" : "Foo Company",
      "active" : 1,
      "funcName" : "funcA"
   },
   "vendorB" : {
      "cName" : "Bar Company",
      "active" : 0,
      "funcName" : "funcB"
   },
   "vendorC" : {
      "cName" : "FooBar Company",
      "active" : 1,
      "funcName" : "funcC"
   }
}

Цикл по json, если "active == 1", затем добавить имя функции в массив.

var doFunctions = [] ;
for (var key in vendorObj) {
   if (vendorObj[key].active == 1) {
      doFunctions.push(window[vendorObj[key].funcName]) ;
   }
}

Если я обработаю их, как в этом цикле for, он работает, добавленные / активные функции выполняются правильно:

for (var x=0;x<doFunctions.length;x++) {
   doFunctions[x]() ;  
   //even as promises this works, they are just processed individually
}

Однако в $q.all() при определении вручную,функции передаются в массиве как '$ q.all ( [funcA (), funcC (), funcG ()] ). then (function (response) {...})'

Итак, у меня проблема в том, как передать doFunctions, чтобы каждое значение автоматически распознавалось как функция, поскольку я не могу добавить () после каждого значения массива, просто указав имя массива, как вследующее:

$q.all(doFunctions).then(function(response) {
   // process `response`
}

Ответы [ 2 ]

2 голосов
/ 10 июля 2019

Создайте хеш, который ссылается на функции:

var hash = { 
    "funcA": funcA,
    "funcB": funcB,
    "funcC": funcC
};

function funcA() {
 // do something
}
function funcB() {
 // do something
}
function funcC() {
  // do something
}

Затем найдите функции в этом хеше:

var promiseArr = Object.values(vendorObj)
                 .filter(_ => _.active == 1 )
                 .map(_ => hash[_.funcName]() );

$q.all(promiseArr).then(function(responseArr) {
     //process responseArr
};
1 голос
/ 10 июля 2019

В настоящее время вы нажимаете ссылку на функцию, а не обещание, которое вы пытаетесь выполнить.Попробуйте следующее:

var doFunctions = [] ;
for (var key in vendorObj) {
   if (vendorObj[key].active == 1) {
      doFunctions.push(window[vendorObj[key].funcName]()) ;
   }
}

Ваш массив doFunctions теперь содержит обещания, а не функции.

...