Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何防止函数数组中的函数在前一个函数完成之前执行_Javascript_Jquery - Fatal编程技术网

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;iroutineConverter(例程)
只有在执行某个异步代码时才会发生这种情况,您是否在任何函数中运行了某些代码?你能提供一个可运行的代码段吗?你尝试过promisesIs这个异步的吗?如果不是,则可以以0为间隔使用setTimeout。如果是异步的,则使用承诺。如果不是异步的,则保证您的函数在下一个函数开始执行之前完成。这是由于Javascript的同步、单线程(除非您使用的是webworkers)特性