2013-02-01 13 views
9

Próbuję użyć phantomjs, aby uzyskać dane na temat prawdopodobieństwa wystąpienia stanu wyścigu na stronie, mam 2 pliki skryptów, niektóre funkcje hostowane w mojej witrynie zależą od niektórych globali ustawionych przez plik pochodzący od strony trzeciej .onResourceReceived dwa razy rejestruje każdy zasób?

Pomyślałem, że używając onResourceReceived w phantomjs mogę zalogować się po załadowaniu każdego pliku, a następnie uruchomić ten test kilka razy, aby zorientować się, jak często ten stan wyścigu spowoduje problemy, przykład mojego kodu znajduje się poniżej (to jest nie rzeczywisty kod i nie jestem związany z BBC):

(function (p, wp) { 
    "use strict"; 
    var page, start, 
    count = 0, max = 10, 
    webpage = require('webpage'), 
    url = "http://www.bbc.co.uk"; 

    function process() { 
    if (max == count) { 
     console.log('done processing!'); 
     p.exit(); 
    } else { 
     count++; 
     start = new Date(); 
     page = wp.create(); 
     page.onResourceReceived = onResourceReceived; 
     page.open(url, onOpen); 
    } 
    } 

    function onResourceReceived(response) { 
    var match, t = new Date(), 
    url = response.url, 
    status = response.status; 
    t = t.valueOf() - start.valueOf(); 
    if (!!(match = url.match(/locator\.css/))) { 
     console.log(match[0] + ': ' + t + 'msecs status: ' + status); 
    } 
    if (!!(match = url.match(/en-GB\.json/))) { 
     console.log(match[0] + ': ' + t + 'msecs status: ' + status); 
    } 
    }; 

    function onOpen() { 
    console.log('Test ' + count + ' done!!!'); 
    page.close(); 
    process(); 
    } 

    process(); 
}(phantom, require('webpage'))); 

to trochę trwa, jak się spodziewałem, z wyjątkiem, że każdy plik jest rejestrowane dwa razy, dlaczego tak jest? Czasami różnice w czasie są bardzo różne. locator.css: 323msecs cywilny: 200 locator.css: 323msecs cywilny: 200 en-GB.json: 2199msecs statusu: 200 en-GB.json: 2200msecs statusu: 200 test 1 zrobione !!!

Odpowiedz

17

Należy sprawdzić właściwość response.stage. etap będzie miał początek i koniec. start daje pierwszy bajt czasu przybyłego, a koniec podaje, kiedy uzyskasz kompletną odpowiedź.

proszę dodać czek w swojej funkcji.

function onResourceReceived(response) { 
    if(response.stage == 'end') return; 
    //rest of your code from above example. 

};

+0

Dziękuję bardzo, ta odpowiedź jest idealna –

Powiązane problemy