Javascript 如何防止函数数组中的函数在前一个函数完成之前执行
在试图找到一种方法来运行存储在如下数组中的某些函数时,我生成了以下代码 这很好,但有时它似乎在前一个函数完成之前执行一个函数 如何防止在完成上一步之前在下面的代码中执行函数 具有多个函数“调用”和参数的数组示例Javascript 如何防止函数数组中的函数在前一个函数完成之前执行,javascript,jquery,Javascript,Jquery,在试图找到一种方法来运行存储在如下数组中的某些函数时,我生成了以下代码 这很好,但有时它似乎在前一个函数完成之前执行一个函数 如何防止在完成上一步之前在下面的代码中执行函数 具有多个函数“调用”和参数的数组示例 ["A3",[6]],["B1",["TEST",4,13]],["A10",[2]],["A7",[1,5]] 执行上述数组中每个函数调用的for循环 function routineConverter(v){ var routines = JSON.parse('[' +
["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];
}
功能路由转换器(v){
var routines=JSON.parse('['+v+']');
for(var i=0;i
函数示例:
function A1(p) {
$('#tbl tr td:nth-child(' + parseInt(p) + ')').after('<td></td>');
}
功能A1(p){
$('#tbl tr td:n子项('+parseInt(p)+'))。在('')之后;
}
我承认这不是最好的方法,但您可以在已执行函数的and处返回一个if,例如,您可以使用此int来启动另一个函数
但这是一个折衷的解决方案。我留下了一条评论,询问您的问题是什么,因为我希望有更好的解决方案。不管怎样,我有一个答案给你。您需要将要调用的函数放入对象中,以使此解决方案正常工作。您还需要ES6支持或babelify您的代码
const调用=[[A3]、[6]、[B1]、[TEST],4,13]、[A10]、[2]、[A7]、[1,5]];
常量函数={
A3:函数(…args){
console.log('A3',args);
},
B1:函数(…参数){
console.log('B1',args);
},
A10:函数(…参数){
console.log('A10',args);
},
A7:函数(…参数){
console.log('A7',args);
}
};
const functionCaller=fns=>
map(([fn,…args])=>函数[fn](…args));
log(functionCaller(calls))代码>我假设您使用的是异步代码。在您的示例中,同步代码已经按照您所希望的方式工作,函数按顺序调用
为了异步工作,您可以利用async/await
和promissions。在执行此操作时,将调用async
函数,但switch语句将等到它们完成后,才允许线程继续循环。这可以在我所附的示例中看到
请注意,如果在不使用wait的情况下异步调用C,则C的超时是最低的,并且将首先完成。但是,由于将async
函数与await
C一起使用,因此C是最后一个要调用的函数
var例程=[[A1]、[PARAM-A]、[B1]、[PARAM-B]、[C1]、[PARAM-C];
功能A1(参数){
返回新承诺(解决=>{
设置超时(()=>{
解析(`A1 FUNC:${param}`);
}, 1000);
});
}
功能B1(参数){
返回新承诺(解决=>{
设置超时(()=>{
解析(`B1 FUNC:${param}`);
}, 500);
});
}
功能C1(参数){
返回新承诺(解决=>{
设置超时(()=>{
解析(`C1 FUNC:${param}`);
}, 100);
});
}
异步函数routineConverter(例程){
var结果=[]
for(var i=0;i routineConverter(例程)
只有在执行某个异步代码时才会发生这种情况,您是否在任何函数中运行了某些代码?你能提供一个可运行的代码段吗?你尝试过promisesIs这个异步的吗?如果不是,则可以以0为间隔使用setTimeout。如果是异步的,则使用承诺。如果不是异步的,则保证您的函数在下一个函数开始执行之前完成。这是由于Javascript的同步、单线程(除非您使用的是webworkers)特性