2017-10-12 5 views
0

Je rencontre un problème avec setTimeout(), il ne semble pas être en attente d'appel de la fonction. Tout d'abord, je l'utilisais comme ceci:javascript setTimeout() pas d'attente, même après l'appel en tant que fonction anonyme

function function1(driver){ 
    driver.get(secondaryUrl); 
} 

driver.get(initialUrl); 
setTimeout(function1, 3000, driverInstance); 

Cela ne fonctionnait pas, il fallait simplement passer le délai. Donc je l'ai regardé et apparemment envelopper la fonction comme une fonction anonyme permettrait de le réparer. J'ai donc essayé ceci:

function function1(driver){ 
    driver.get(secondaryUrl); 
} 

setTimeout(function(){ function1(driverInstance)}, 3000); 

Mais ce serait faire la même chose, juste sauter le retard et accédez à la seconde URL dès le premier est chargé. Quelqu'un peut-il m'aider avec une solution? Merci

+0

Le deuxième exemple fonctionne comme prévu. –

+0

C'est le point de * asynchronie * - il n'attend pas que l'action se passe, il ne fait que planifier quelque chose qui arrivera dans le futur, puis il revient immédiatement. – Bergi

+0

J'ai lu sur de nombreux articles que si je l'enveloppais comme une fonction anonyme, il attendrait avant d'exécuter –

Répondre

0

Retirez le troisième paramètre de cette

setTimeout(function1, 3000, driverInstance); 

Cela devrait être setTimeout(function() { function1(driverInstance) }, 3000);

+0

Je dois passer le paramètre à travers la fonction si? –

+3

Pourquoi le troisième paramètre doit-il être supprimé? C'est comme ça que vous passez des arguments. – skyline3000

+0

Ceci saute toujours le temps d'attente et exécute la fonction immédiatement –

0

Je ne sais pas si je vous comprends bien, parce qu'il manque de déclaration des variables dans votre exemple. Je suppose que vous créez un objet dans JS avec une certaine méthode. Et le vous souhaitez appeler cette méthode deux fois avec un certain délai entre. Si oui, le code comme ci-dessous devrait fonctionner. J'ai remplacé la méthode get en processUrl.

var url1 = 'http://something'; 
var url2 = 'http://another'; 

function Driver(url) { 
    this.processUrl = function(url) { 
    // some logic with URL 
    console.log(url); 
    } 
} 

var driver = new Driver() 

driver.processUrl(url1); 

function fun1(instance) { 
    instance.processUrl(url2) 
} 

setTimeout(fun1, 3000, driver); 

ou même solution plus simple sans utiliser la fonction supplémentaire:

var url1 = 'http://something'; 
var url2 = 'http://another'; 

function Driver(url) { 
    this.processUrl = function(url) { 
    // some logic with URL 
    console.log(url); 
    } 
} 

var driver = new Driver() 

driver.processUrl(url1); 
setTimeout(driver.processUrl, 3000, url2); 

Ce qui est important ici: manque de parenthèses (). Lorsque vous ajoutez des parenthèses à la fin du nom de la fonction, elle appelle immédiatement la fonction lorsque le code est un processus. Vous devez fournir référence pour fonctionner qui devrait être appelée après 3 secondes.