根据json对象字符串值在$ q.all()中创建一个承诺数组

时间:2019-07-10 13:52:20

标签: javascript arrays angularjs angular-promise

我有一堆通过需要从$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"
   }
}

如果“ active == 1”,则遍历json,然后将函数名称添加到数组中。

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 个答案:

答案 0 :(得分:2)

创建引用函数的哈希:

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 :(得分:1)

当前,您正在推动对该功能的引用,而不是您要解决的承诺。 请尝试以下操作:

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

您的doFunctions数组现在包含promise,而不是函数。