2017-07-19 1 views
3

Editer: Ce n'est pas le double de la façon de passer des paramètres dans setTimeout. En fait, je veux savoir comment écrire une fonction qui serait appelée comme une méthode sur la fonction prédéfinie, tout comme l'API setTimeout.Implémentation pour une fonction 'callAfter' qui permet d'appeler n'importe quelle fonction après une durée spécifiée

Alors, comment puis-je écrire une implémentation d'une fonction « callAfter » qui permet une fonction à appeler après une durée déterminée avec certains paramètres, avec la syntaxe indiqués ci-dessus:

Exemple: Disons que vous avez un fonction appelée 'somme' comme ceci:

function sum(a, b) { 
console.log('Sum is: ', a + b); 
} 

maintenant, vous devriez être en mesure d'exécuter: sum.callAfter (5000, 8, 9);

qui devrait appeler la fonction 'somme' au bout de 5 secondes avec les paramètres 8 et 9.

+0

Utiliser le délai d'expiration. https://www.w3schools.com/js/js_timing.asp – Etherealm

+0

Copie possible de [Comment puis-je transmettre un paramètre à un rappel setTimeout()?] (https://stackoverflow.com/questions/1190642/how-can -i-pass-a-parameter-to-a-settimeout-callback) – Etherealm

+1

Cela ressemble à une question d'entrevue ou de devoirs. Qu'avez-vous essayé jusqu'à présent? – lxe

Répondre

7

Got it using Fonction de prototypage:

Function.prototype.callAfter = function(){ 
    if(arguments.length > 1){ 
     var args = Array.prototype.slice.call(arguments); 
     var time = args.splice(0,1); 
     var func = this; 
     setTimeout(function(){ 
      func.apply(null, args); 
     }, time); 
    } 

}

+0

Bonne réponse, mais en guise de remarque, il est mal vu d'ajuster le prototype d'objets JavaScript natifs. Cela fonctionne, mais cela peut aussi causer des problèmes quand il s'agit de maintenir le code et d'incorporer des bibliothèques. – zfrisch

+0

@zfrisch C'est vrai. Pouvez-vous me montrer une meilleure solution? En fait, je cherche la meilleure approche. –

0

function sum(a, b) { 
 
    console.log('Sum is: ', a + b); 
 
} 
 
function callWithDelay(fn, arg1, arg2, delay) { 
 
    setTimeout(function() { fn(arg1, arg2) }, delay); 
 
} 
 
callWithDelay(sum, 3, 5, 1000);

cela devrait le faire, mais il est pas très jolie :)