2013-08-22 138 views
0

我正在通過爲網站編寫Chrome擴展來學習JavaScript。該網站有一個顯示4個視頻列表的部分,並帶有一個按鈕來加載更多視頻。當你點擊這個按鈕時,它會通過AJAX調用加載一個新的視頻列表。函數(從setTimeout調用)不返回值

我有一個函數getNextVideo(),它獲取列表中下一個視頻的URL。例如,如果您使用的是第三個視頻,則會抓取第四個視頻的網址。如果您使用的是第四個視頻,則會通過功能getNextVideoList()模擬點擊(加載新視頻列表),然後在1秒超時後抓取新加載列表中的第一個,以等待DOM更新(我嘗試使用突變觀察者,但對我的技能水平來說太複雜了)。

function getNextVideo() 
{ 
    if (getVideoPosition() == 4) 
    { 

     function ad() 
     { 
      getVideo(1); 
     } 

     setTimeout(ad, 1000); 

     getNextVideoList(); 
    } 
    else 
    { 
     var index = getVideoPosition() + 1; 
     return getVideo(index); 
    } 
} 

getVideoPosition()獲取列表中的視頻使用一些簡單的jQuery第n個孩子選擇的指數。它返回值1,2,34

getVideo(n)獲取視頻的索引(1,2,3或4)並返回該視頻的URL。返回值看起來像這樣在控制檯:"http://video.example.com/video-id"

我的問題是,當我的影片,是4日在隊列中跑getNextVideo(),我得到undefined在我的控制檯返回。在AJAX調用和後續DOM更新之後,如何使getNextVideo()函數返回列表中第一個視頻的URL?

+0

我可以看到你的Ajax調用嗎?您可能需要將您的回調包裝在代理功能中 – Paul

+0

看起來您有一個錯誤。你確定你用來迭代的索引在範圍內嗎?特別是在getVideoPosition()和getVideo(n)中? – Hrishi

+2

閱讀[是否有可能從'setTimeout'返回一個值?](http://stackoverflow.com/questions/13730709/is-it-possible-to-return-a-value-from-settimeout-without-a -callback-function?rq = 1)和[如何從AJAX調用中返回值?](http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax -call?rq = 1) – DCoder

回答

1

這是因爲getNextVideo()沒有返回值getVideoPosition() == 4時。沒有返回值顯示爲undefined

如果你看看你的代碼,if (getVideoPosition() == 4)塊內部沒有任何回報。當函數沒有返回時,返回值是undefined。如果你想要有一個返回值,那麼你必須添加一個返回語句。請注意,setTimeout()調用的函數在getNextVideo()已經返回後執行,因此它不能參與設置返回值。

如果你真的想用異步編程與setTimeout()(我不確定你爲什麼要這麼做),那麼你將不得不切換到異步編程模型,這意味着你不會使用根據getNextVideo()的返回值,但會在下一個值完成時調用回調。該回調可以在setTimeout()內異步執行。但是,我不知道爲什麼你首先使用setTimeout(),所以我不知道這種額外的複雜性是否是最好的選擇。如果你擺脫了異步setTimeout(),那麼你也可以通過getNextVideo()這個分支正常返回一個值。

+0

非常感謝!我意識到我的代碼非常複雜,所以我保持簡單的代碼。我所做的是將一些代碼(我知道,將這些代碼寫入get方法是一種很差的做法)將一個CSS類添加到下一個列表的第一個視頻中,等待一秒鐘,然後獲取URL。這一切都完美。非常感謝! – lmike215

0

就我對您的代碼的理解而言,您正在將控件從您的函數「getNextVideo」轉移到發生條件時的setTimeOut回調。
「getNextVideo」函數的實際職責是「返回getVideo(index);」

是否有可能,如果你這樣做你的代碼。

 if (getVideoPosition() == 4) 
{ 
    function ad() 
    { 
     getNextVideo(true); 
    } 
    setTimeout(ad, 1000); 
    getNextVideoList(); 
} 


function getNextVideo(isFirst) 
{ 
    var index = isFirst==true?1:getVideoPosition() + 1; 
    return getVideo(index); 
}