Как управлять выполнением функции, которая вызывается повторно на основе значений параметров, предоставленных функции?

#javascript #jquery

#javascript #jquery

Вопрос:

У меня есть это требование, когда я хочу выполнить функцию на основе значений параметров, как описано ниже. Эта функция в моем файле FileA.js вызывается в цикле повторно из какого-либо внешнего файла, а исходный код внешнего файла не находится под моим контролем, т.Е. Я не могу изменить способ вызова функции.

 //FileA.js
function myfunction(param1 , param2, param3 ){

   /* function logic */
}
  

Я специально рассматриваю два значения в param3, предположим, ‘xyz’ и ‘abc’. Если значение ‘abc’ приходит первым, я хочу подождать, пока значение ‘xyz’ не появится в param3, и выполнить функцию так, чтобы сначала она выполнялась для значения ‘xyz’, а затем ‘abc’. Пожалуйста, помогите, не могу разобраться.

Ответ №1:

Это моя реализация с использованием функций первого класса и замыканий javascript :

 // declare an additional queue to pile up commands as nessecary
let queue = [] 


// since you have no control over this function invocation, leaving it 
// as is
function myFunction(param1, param2, param3){
  // call the queueing logic right away
  queueingLogic(param1,param2,param3)
}

function queueingLogic(param1, param2, param3){
  // if param3 is 'abc' queue
  if(param3 ==='abc'){
    // the queue will recieve a function declaration, rather than the execution of the function
    queue.push(actualLogic(param1,param2,param3))
  }
  // else execute the logic and execute the rest of the pending tasks
  if(param3 === 'xyz'){
    // execute your actual logic for 'xyz'
    actualLogic(param1,param2,param3)();
    // loop through the queue, executing the functions
    queue.forEach(pending => pending())
    // empty the queue, since all has been executed
    queue = []
  }
}

function actualLogic(param1, param2, param3){
  // create a javascript closure to delay invocation
  // you will be returning a function declaration, and it will be invoked later
  return function(){
    console.log(param1, param2, param3)
    // your actual logic here
  }
}


//testing
myFunction('1st call', 'param21', 'abc')
myFunction('2nd call', 'param22', 'abc')
myFunction('3rd call', 'param23', 'abc')
myFunction('4th call', 'param24', 'xyz')
  

Вывод :

 4th call param24 xyz
1st call param21 abc
2nd call param22 abc
3rd call param23 abc
  

Дайте мне знать, если это то, что вы хотели.