我如何在phantomJS中执行jQuery的承诺?

我正在使用试图在服务器端使用nodejs和phantomjs来search我们的网站。 虽然AJAX工作正常,我不能执行我已经在我的代码中使用自定义的承诺。 如何让幻影等待承诺解决。 以下是我编码的内容。

$('body').addClass('before-dom-ready'); $(function() { $('body').addClass('after-dom-ready'); var dfrd = $.Deferred(), promise = dfrd.promise(); setTimeout(function() { dfrd.resolve(); }, 5000); promise.done(function() { $('body').addClass('promise-executed'); }); }); 

phantomJS增加了“准备就绪”和“准备就绪”的课程,但是我无法获得“承诺执行”的课程。

PhantomJs不会自动等待所有待处理脚本的结束。 在onload事件上调用WebPage#onLoadFinished。

至于大部分脚本,这里的想法是等到“某件事”完成或者真实。 我强烈build议你testingwaitfor.js 。 在PhantomJs中理解这个例子是非常重要的。

我想你的例子是一个例子,但让我提出一个答案。

Html页面

 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <script type="text/javascript" src="http://code.jquery.com/jquery-1.10.0.min.js"></script> <title>Test</title> </head> <body id="body"> <script type="text/javascript"> //alert('hello'); $('body').addClass('before-dom-ready'); $(function () { $('body').addClass('after-dom-ready'); var dfrd = $.Deferred(), promise = dfrd.promise(); setTimeout(function () { dfrd.resolve(); }, 5000); promise.done(function () { $('body').addClass('promise-executed'); $('body').text('Hello World !'); }); }); </script> </body> </html> 

PhantomJs脚本

 var page = require('webpage').create(); var system = require('system'); function waitFor(testFx, onReady, timeOutMillis) { var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 10000, //< Default Max Timout is 10s start = new Date().getTime(), condition = false, interval = setInterval(function () { if ((new Date().getTime() - start < maxtimeOutMillis) && !condition) { // If not time-out yet and condition not yet fulfilled condition = (typeof (testFx) === "string" ? eval(testFx) : testFx()); //< defensive code } else { if (!condition) { // If condition still not fulfilled (timeout but condition is 'false') //console.log("'waitFor()' timeout"); typeof (onReady) === "string" ? eval(onReady) : onReady(); clearInterval(interval); //phantom.exit(1); } else { // Condition fulfilled (timeout and/or condition is 'true') console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms."); typeof (onReady) === "string" ? eval(onReady) : onReady(); //< Do what it's supposed to do once the condition is fulfilled clearInterval(interval); //< Stop this interval } } }, 500); //< repeat check every 500ms }; if (system.args.length != 1) { console.log('invalid call'); phantom.exit(1); } else { //adapt url to your context page.open('http://localhost:9231/demo.html', function (status) { if (status !== 'success') { console.log('Unable to load the address!'); phantom.exit(); } else { waitFor( function () { return page.evaluate(function () { return $('body').hasClass('promise-executed'); }) > 0; }, function () { page.render('page.png'); phantom.exit(); }, 10000); } }); } 

基本上,如果主体有一个名为'promise-executed'的类, waitFor将每隔500毫秒检查一次。