#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
Дайте мне знать, если это то, что вы хотели.