下面的代码希望Phantom.js加载页面,单击按钮并等待5秒钟,然后返回页面的HTML代码。
问题: 但是,使用setTimeout()
5秒钟来创建延迟会导致 page.evaluate
函数返回null
到回调函数而不是HTML。
myUrl = 'http://www.google.com'
var phantom = Meteor.npmRequire('phantom')
phantom.create = Meteor.wrapAsync(phantom.create)
phantom.create( function(ph) {
ph.createPage = Meteor.wrapAsync(ph.createPage)
ph.createPage(function(page) {
page.open = Meteor.wrapAsync(page.open)
page.open(listingUrl, function(status) {
console.log('Page loaded')
page.evaluate = Meteor.wrapAsync(page.evaluate)
page.evaluate(function() {
// Find the button
var element = document.querySelector( '.search-btn' );
// create a mouse click event
var event = document.createEvent( 'MouseEvents' );
event.initMouseEvent( 'click', true, true, window, 1, 0, 0 );
// send click to element
element.dispatchEvent( event );
// Give page time to process Click event
setTimeout(function() {
// Return HTML code
return document.documentElement.outerHTML
}, 5000)
}, function(html) {
// html is `null`
doSomething()
})
})
})
})
替换setTimeout()
为Meteor.setTimeout()
会导致另一个错误:
phantom stdout: ReferenceError: Can't find variable: Meteor
page.evaluate()
是PhantomJS的沙盒页面上下文。它无权访问外部定义的变量。如果需要超时,则需要对进行两次调用page.evaluate()
,因为您无法从异步函数返回任何内容解释:
page.evaluate(function() {
...
element.dispatchEvent( event );
}, function() {
setTimeout(function() {
page.evaluate(function() {
return document.documentElement.outerHTML
}, function(html) {
doSomething()
})
}, 5000)
})
page.evaluate()
您可以通过直接访问此处定义的内容来缩短代码,而不用使用第二个调用:
setTimeout(function() {
page.get("content", function(content) {
doSomething()
})
}, 5000)
问题内容: 我是角度框架的新手。这是我的情况,我想在一段时间后更改$ scope.variable,所以我使用了javascript 方法。 此代码对我不起作用。我曾经使这段代码起作用。 后来我才知道angular本身有一个$ timeout服务,可以完成相同的工作。 如何比较JavaScript服务的性能? 为什么我们应该使用而不是?? 请给我一些示例和使用它的理由,以显示性能。 谢谢 :) 问
我使用子JPanel构造JScrollPane,然后尝试将JScrollPane添加到父JPanel中,希望有一个可滚动的自定义JPanel。 我有一个大的细白线前面的所有我的组件,他们是没有滚动。有什么想法吗?
问题内容: 我有一个使用该函数并调用另一个方法的方法。在初始加载时,方法2可以正常工作。但是,超时后,我得到一个错误,它是未定义的。我在这里做错了什么? 例如: 问题答案: 问题是导致javascript使用全局范围。本质上,您是在调用类,而不是从中调用。相反,您只是在告诉您使用没有特定作用域的函数。 要解决此问题,您可以将函数调用包装在另一个引用正确变量的函数调用中。它看起来像这样: 可能是因为
问题内容: 我对工作方式有些困惑。我正在尝试在循环中添加一个,以便循环迭代之间相距1秒。每次循环迭代都会发出一个HTTP请求,而另一端的服务器似乎无法在这么短的时间内处理那么多请求。 为什么这不起作用,我如何实现呢? 谢谢 问题答案: 你需要这样的东西 另请参阅此小提琴 此时,您可以致电服务器。请注意,计数器的工作方向相反(递减计数)。我更新了一些注释,说明在哪里可以做您的事情。
我正在尝试返回在setTimout中计算的值。但好像我拿不出这个值。我读到要做到这一点,我必须用promise。我是否必须像下面这样使用它:https://italonascimento.github.io/application-a-timeout-to-your-promissions/?
我已经为android Studio创建了一个webview应用程序。但没有加载web URL。错误为NET::ERR_ACCESS_DENIED。有谁能帮忙吗