2013-08-22 96 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); 
}