如何防止函数数组中的函数在上一个函数完成之前执行

时间:2018-03-22 22:00:45

标签: javascript jquery

在尝试找到一种方法来运行存储在如下所示的数组中的某些函数时,我生成了以下代码。

这很好用,但有时似乎在前一个函数完成之前执行一个函数。

如何在上一个完成之前阻止在下面的代码中执行函数?

具有多个功能的数组示例"调用"和参数

 ["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>');  
}

3 个答案:

答案 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 syntaxspread operator将它们分离到自己的数组中

然后我们将此函数名称作为对象的键,调用请求与参数一起使用的特定方法。

当您运行代码段时,您将看到正确的函数名称以及传递的参数,但将返回未填充的数组,因为没有任何已定义的函数返回任何内容。如果他们这样做,我们会看到这个数组被填充。

答案 1 :(得分:0)

我承认这不是最好的方法,但你可以返回一个if和一个已执行的函数,你可以使用这个int来启动另一个函数。

但那是一个妥协的解决方案。

答案 2 :(得分:0)

我假设您正在使用异步代码。您的示例中的同步代码已经按照您希望的方式工作,函数被顺序调用。

为了使这项工作异步,您可以利用async/await和承诺。这样做将调用async函数,但是在允许线程继续循环之前,switch语句将一直等到它们完成。这可以在我附上的例子中看到。

注意C具有最低的超时,如果不使用await异步调用,它将首先完成。但是由于使用带有async的{​​{1}}函数,C是要调用的最后一个函数。

&#13;
&#13;
await
&#13;
&#13;
&#13;