2013-07-30 1 views
2

Я использую phantomjs для рендеринга нескольких специализированных html-страниц в PDF; так как это сервис, который нужно масштабировать, я стараюсь уменьшить как можно больше накладных расходов. Все страницы имеют одинаковую структуру, используют один и тот же CSS и в большинстве случаев похожи, поэтому я решил повторно использовать одну и ту же страницу html и просто вызвать javascript для замены содержимого. Таким образом, он не должен перезагружать CSS и веб-шрифты и т. Д.Как определить, когда phantomjs выполняется рендеринг?

Чтобы сделать вещи несколько более сложными, я контролирую рендер из node.js, используя интерфейс отдыха, который я создал с помощью веб-сервера phantom.js. Веб-сервер отлично работает - если я не повторно использую страницу, все работает отлично.

Проблема, с которой я сталкиваюсь, заключается в том, что у меня нет возможности узнать, когда я могу сообщить об этом узлу (через http-соединение), что файл готов к использованию.

if (filename.substr(-4) == ".pdf") { 
    p.paperSize = {format: 'Letter', orientation: 'portrait', margin: '1cm'}; 
} 
// loadPage evaluates javascript in the page to have it load the contents 
// of the url into its body; the callback is triggered by a console.log 
// inside the page that tells us when the ajax request has finished and 
// the content is ready to be rendered. 
loadPage(p, url, function() { 
    console.log("Loaded", url); 
    p.render(filename); 
    console.log("Rendered?", url); 
    // sendJSON returns the response to the node client 
    sendJSON(response, {filename: filename, status: "success"}); 
}); 

У меня есть проблема в том, что sendJSON вызывается до того p.render отделки - это не блокирует. Честно говоря, я бы не ожидал, что это будет блокирование, учитывая, что это javascript, но он также, похоже, не принимает функцию обратного вызова, чтобы сообщить мне, когда она закончится.

Кто-нибудь нашел решение проблемы этого типа?

ответ

1

Получается, что на самом деле он блокировал рендер, но, похоже, он не был, потому что сама страница по-прежнему загружалась при вызове рендера. $ (window) .load не делает сам по себе, чтобы гарантировать, что css и шрифты и все были загружены до ответа.

Для любых других пользователей, которые хотят попробовать что-то вроде этого, это кажется более справедливым, чем создание новой страницы каждый раз, но это может быть немного сложнее, чтобы получить правильное время.

 Смежные вопросы

  • Нет связанных вопросов^_^