javascript - 在 $q.all() 中从 json 对象字符串值创建一个 Promise 数组

标签 javascript arrays angularjs angular-promise

我有一堆通过服务加载的函数,需要从 $q.all([funcA(),funcB(),funcC()]) 执行。然后我有 json 文件,它告诉脚本要处理哪些服务。我遇到的问题是将 json 值保存到一个数组中,该数组可以传递到 $q.all(doFuncs).then ,其中数组的值将作为函数进行处理。

如上所述,这些功能是从各种服务加载的。从技术上讲,每个函数都是一个 promise ,但为了简单起见,我在这里将它们表述为一个函数:

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

从远程服务器动态加载的 json 文件将允许我根据需要打开/关闭要处理的不同 vendor :

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(函数(响应) { ... })'

所以我遇到的问题是如何传递 doFunctions 以便每个值都被自动识别为函数,因为我无法在每个值之后添加 ()简单地声明数组名称时的数组值,如下所示:

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

最佳答案

创建引用函数的哈希:

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
};

关于javascript - 在 $q.all() 中从 json 对象字符串值创建一个 Promise 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56972224/

相关文章:

javascript - Svelte 组件从 URL 哈希参数存储-加载状态到-

javascript - 在 Raphael 中撤消到前面?

javascript - jquery获取突出显示文本的html并更改其样式

arrays - 是否有与字节数组等效的Perl 6?

javascript - 有没有办法为选定的 DOM 元素禁用 Angular 的双花括号表示法?

javascript - 使用 angularJs 发送带有附件的电子邮件?

javascript - 想在 android 中使用 node.js 和 socket.io 发送图像

javascript - 使用push方法将对象插入数组

arrays - 如何提高我的域名统计算法的效率?

javascript - 在 angular.js 中定义从动态 URL 的重定向