从 json 对象字符串值在 $q.all() 中创建一个承诺数组
Create an array of promises in $q.all() from json object string values
我有一堆函数是通过需要从 $q.all([funcA(),funcB(),funcC()])
执行的服务加载的。然后我有 json 文件告诉脚本要处理哪些服务。我遇到的问题是将 json 值保存到一个数组中,该数组可以传递给 $q.all(doFuncs).then
,其中数组的值将作为函数处理。
如前所述,这些功能是从各种服务加载的。从技术上讲,每个函数都是一个承诺,但为了简单起见,我在这里将它们声明为一个函数:
function funcA() {
// do something
}
function funcB() {
// do something
}
function funcC() {
// do something
}
从远程服务器动态加载的 json 文件将允许我根据需要转 on/off 不同的供应商进行处理:
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 if "active == 1",然后将函数名称添加到数组中。
var doFunctions = [] ;
for (var key in vendorObj) {
if (vendorObj[key].active == 1) {
doFunctions.push(window[vendorObj[key].funcName]) ;
}
}
如果我像在这个 for 循环中那样处理它们,它会工作,added/active 函数会正确执行:
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 doFunctions = [] ;
for (var key in vendorObj) {
if (vendorObj[key].active == 1) {
doFunctions.push(window[vendorObj[key].funcName]()) ;
}
}
您的 doFunctions 数组现在包含承诺,而不是函数。
创建引用函数的散列:
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
};
我有一堆函数是通过需要从 $q.all([funcA(),funcB(),funcC()])
执行的服务加载的。然后我有 json 文件告诉脚本要处理哪些服务。我遇到的问题是将 json 值保存到一个数组中,该数组可以传递给 $q.all(doFuncs).then
,其中数组的值将作为函数处理。
如前所述,这些功能是从各种服务加载的。从技术上讲,每个函数都是一个承诺,但为了简单起见,我在这里将它们声明为一个函数:
function funcA() {
// do something
}
function funcB() {
// do something
}
function funcC() {
// do something
}
从远程服务器动态加载的 json 文件将允许我根据需要转 on/off 不同的供应商进行处理:
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 if "active == 1",然后将函数名称添加到数组中。
var doFunctions = [] ;
for (var key in vendorObj) {
if (vendorObj[key].active == 1) {
doFunctions.push(window[vendorObj[key].funcName]) ;
}
}
如果我像在这个 for 循环中那样处理它们,它会工作,added/active 函数会正确执行:
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 doFunctions = [] ;
for (var key in vendorObj) {
if (vendorObj[key].active == 1) {
doFunctions.push(window[vendorObj[key].funcName]()) ;
}
}
您的 doFunctions 数组现在包含承诺,而不是函数。
创建引用函数的散列:
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
};