在尝试找到一种方法来运行存储在如下所示的数组中的某些函数时,我生成了以下代码。
这很好用,但有时似乎在前一个函数完成之前执行一个函数。
如何在上一个完成之前阻止在下面的代码中执行函数?
具有多个功能的数组示例"调用"和参数
["A3",[6]],["B1",["TEST",4,13]],["A10",[2]],["A7",[1,5]]
从上面的数组执行每个函数调用的for循环
function routineConverter(v){
var routines = JSON.parse('[' + v + ']');
for ( var i=0; i < routines.length ; i++ ){
switch (routines[i][0]) {
case 'A1':
routines[i] = A1( routines[i][1] );
break;
case 'A2':
routines[i] = A2( routines[i][1] );
break;
case 'A3':
routines[i] = A3( routines[i][1] );
break;
case 'A4':
routines[i] = A4( routines[i][1] );
break;
case 'A5':
routines[i] = A5( routines[i][1] );
break;
case 'A6':
routines[i] = A6( routines[i][1] );
break;
case 'A7':
routines[i] = A7( routines[i][1] );
break;
case 'A8':
routines[i] = A8( routines[i][1] );
break;
case 'A9':
routines[i] = A9( routines[i][1] );
break;
case 'A10':
routines[i] = A10( routines[i][1] );
break;
case 'B1':
routines[i] = B1( routines[i][1] );
break;
case 'B2':
routines[i] = B2( routines[i][1] );
break;
case 'E':
routines[i] = conditionalAction( routines[i][1] );
break;
case 'X1':
//console.log(routines[i][1]);
routines[i] = REMOVE(routines[i][1] ); //B1( routines[i][1] );
break;
}
}
var a = [routines];
}
功能示例:
function A1(p) {
$('#tbl tr td:nth-child(' + parseInt(p) + ')').after('<td></td>');
}
答案 0 :(得分:1)
我发表评论询问您的问题是什么,因为我希望有一个更好的解决方案。无论我有什么答案。您需要将要调用的函数放入对象中,以使此解决方案起作用。您还需要ES6支持或亲自验证您的代码。
const calls = [["A3",[6]],["B1",["TEST",4,13]],["A10",[2]],["A7",[1,5]]];
const functions = {
A3: function (...args) {
console.log('A3', args);
},
B1: function (...args) {
console.log('B1', args);
},
A10: function (...args) {
console.log('A10', args);
},
A7: function (...args) {
console.log('A7', args);
}
};
const functionCaller = fns =>
fns.map(([fn, ...args]) => functions[fn](...args));
console.log(functionCaller(calls));
这里functionCaller
函数接收调用数组,例如在顶部定义的调用数组,并映射它们,返回结果数组。
地图的工作原理是对数组进行解构,初始元素始终是函数的名称,其余部分是参数,使用destructuring syntax和spread operator将它们分离到自己的数组中
然后我们将此函数名称作为对象的键,调用请求与参数一起使用的特定方法。
当您运行代码段时,您将看到正确的函数名称以及传递的参数,但将返回未填充的数组,因为没有任何已定义的函数返回任何内容。如果他们这样做,我们会看到这个数组被填充。
答案 1 :(得分:0)
我承认这不是最好的方法,但你可以返回一个if和一个已执行的函数,你可以使用这个int来启动另一个函数。
但那是一个妥协的解决方案。
答案 2 :(得分:0)
我假设您正在使用异步代码。您的示例中的同步代码已经按照您希望的方式工作,函数被顺序调用。
为了使这项工作异步,您可以利用async/await
和承诺。这样做将调用async
函数,但是在允许线程继续循环之前,switch语句将一直等到它们完成。这可以在我附上的例子中看到。
注意C具有最低的超时,如果不使用await异步调用,它将首先完成。但是由于使用带有async
的{{1}}函数,C是要调用的最后一个函数。
await
&#13;