2017-10-12 190 views
0

我遇到setTimeout()問題,它似乎沒有等待調用該函數。首先,我是這樣使用它:javascript setTimeout()不等待,即使作爲匿名函數調用後

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

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

這不起作用,它只是跳過延遲。所以我查了一下,顯然是將函數作爲一個匿名函數來修復它。所以,我想這一點:

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

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

但這會做同樣的,只是跳過的延遲,一旦第一個被加載導航到第二個URL。任何人都可以幫我解決問題嗎?由於

+0

第二個示例按預期工作。 –

+0

這就是*異步*的要點 - 它不會等到行爲發生,它只會安排它在將來發生,然後立即返回。 – Bergi

+0

我讀過很多帖子,如果我把它作爲一個匿名函數包裝它會等待執行之前 –

回答

0

從這個

setTimeout(function1, 3000, driverInstance); 

刪除第三個參數這應該是setTimeout(function() { function1(driverInstance) }, 3000);

+0

我需要通過函數傳遞參數? –

+3

爲什麼要刪除第三個參數?這就是你傳遞論據的方式。 – skyline3000

+0

這仍然是跳過等待時間並立即執行該功能 –

0

我不知道如果我理解正確,因爲缺少在您的示例的變量聲明。 我假設你用一些方法在JS中創建對象。而你希望兩次調用這個方法有一些延遲。如果是這樣,那麼下面的代碼應該可以工作。我已將get方法替換爲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); 

,甚至簡單的解決方案,而無需使用附加功能:

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); 

這裏重要的:缺少括號()的。當你在函數名的末尾添加括號時,它會在代碼處理時立即調用函數。您需要提供參考功能,應在3秒後調用。

相關問題