2017-10-21 1 views
1

2 일 동안 검색했지만 변경 사항이 없습니다. 안에 참조 변수에 의해 변수가 필요하지만 불가능한 것처럼 보입니다. 외부 및 내부 모두PhantomJS 변수를 page.evaluate에 전달하여 참조로

var foo = 42; 

setInterval(function(){ 
     console.log('outer '+foo++); 

},1000); 

page.open(url, function() { 

    var pe = page.evaluate(function(foo) { 
    setInterval(function(){ 
      console.log('inner inner '+foo); 
     },1000); 
    },foo); 
    setInterval(function(){ 
     console.log('inner '+foo); 
    },1000); 
}.bind(foo)); 

업데이트되지만 inner inner 푸 static.I 또한 바인딩 시도되고 있지만,이 오류가 반환

SyntaxError: Expected token ']' 

    undefined:2 in evaluateJavaScript 
    phantomjs://platform/webpage.js:390 in evaluate 
    phantomjs://code/foo.js:37 
    :0 
    phantomjs://platform/webpage.js:286 in _onPageOpenFinished 

편집 : 그냥 함수가 평가하는 것이 발견입니다 샌드 박스,이 두 가지 사이에 메시지 전달 또는 IPC와 같은 방법이 있다면 궁금합니다.

답변

0

if there is some way like message passing or IPC between these two?

는 사실이 - page.evaluate는 외부 상황에 간단한 변수 또는 직렬화 된 객체를 반환 할 수 있습니다

var value_from_sandbox = page.evaluate(function(){ return 42; }); 

명시 적으로 귀하의 질문에 그것을 언급하지 않는,하지만 난 걸릴 코드 샘플에서 라이브 페이지에서 일부 변수를 모니터링하려고합니다. 그것은 가능하다 : page.callPhantom,하지만 여전히 문서에서 "실험"으로 표시하고 있습니다 :

page.open(url, function() { 

    // Set interval function in PhantomJS scope 
    // that will extract a variable from the page once a second 
    setInterval(function(){ 

     var foo = page.evaluate(function() { 
      return document.getElementById('foo').innerHTML; 
     } 

     console.log(foo); 

    }, 1000); 

}); 

샌드 박스에서 "집"을 호출하는 또 하나 개의 방법이있다.

+0

내 첫 번째 목표는 외부 (sanbox/평가 중)에서 실시간으로 내부로 데이터를 전송하는 것이 었습니다. 이는 불가능합니다. 그러나 ur 대답의 도움으로 나는'interval' 블록 내부에서 전체 평가를 실행할 수 있고 매번 데이터를 보내고받을 수 있다고 생각합니다. – MaMadLord

+0

그건 불가능한 일이 아닙니다 ... 페이지에서 데이터를 변경하기 위해 자신의 이벤트 리스너를 만든 다음'page.callPhantom'을 사용하여 다시 보냅니다. 그렇지만 page.evaluate + setInterval은 신뢰할 수 있습니다. – Vaviloff

관련 문제