1

현재 활성 탭의 탭 ID 및 탭 URL을 표시하려고합니다. 그러나 모든 경고문 (1,2 및 3)에 주석을 달면 예상대로 결과가 표시되지 않습니다. . 예 : 모든 경고문을 주석 처리 한 후 처음으로 ALT + A를 누르면 변수가 초기화되지 않았다는 것을 의미하는 URL의 null 값과 ID 필드의 0이 생깁니다. //TabBackGround.js 크롬 확장 - 알림 문이 결과를 변경합니다.

var currentTabId = 0; 
var currentTabURL = "null"; 

chrome.commands.onCommand.addListener(function(command) { 

    alert ("1. Inside Listener"); //1 
    chrome.tabs.query({active:true, currentWindow: true}, function(arrayOfTabs) { 

     alert("2. Filtering Results"); //2 
     currentTabURL = arrayOfTabs[0].url; 
     currentTabId = arrayOfTabs[0].id; 

    }); 

    if (command == "toggle") 
    { 
     alert ("3. Resolved Command"); //3 
     alert ("TAB ID = " + currentTabId + "\n URL = " + currentTabURL); 
    }  
}); 

그러나, 나는 모든 경고 문을 유지하는 경우 확장이 잘 작동합니다. 내가 이해할 수없는 것은 경고문이 최종 결과에 어떤 차이가 있는지입니다. ! 주의 할 //Manifest.json

{ 
    "manifest_version": 2, 

    "name": "Display Tab Information", 
    "description": "Extension will display Tab Id and Tab URL in an alert box", 
    "version": "1.0", 

    "background": { 
    "persistent": false, 
    "scripts": ["TabBackGround.js"] 
    }, 

    "commands": 
    { 
     "toggle" : 
     { 
      "suggested_key": { 
       "default": "Alt+A", 
       "mac": "Command+Shift+Y" 
      }, 
      "description" : "Display Id and URL of the current open/active tab." 
     } 
    }, 

    "permissions": ["tabs", "background"], 

    "browser_action": { 
    "default_title": "This App will display Tab Id and Tab URL when user issues the command.", 
    "default_icon": "hello.png" 
    }  
} 

또 다른 점은 var에 currentTabId = 0; var currentTabURL = "null";

chrome.commands.onCommand.addListener (함수 (명령) {

//alert ("1. Inside Listener"); 
chrome.tabs.query({active:true, currentWindow: true}, function(arrayOfTabs) { 

    alert("2. Filtering Results"); 
    currentTabURL = arrayOfTabs[0].url; 
    currentTabId = arrayOfTabs[0].id; 

}); 

if (command == "toggle") 
{ 
    alert ("3. Resolved Command" + "TAB ID = " + currentTabId + "\n URL = " + currentTabURL); 
    alert ("4. Check when does this get executed" + "TAB ID = " + currentTabId + "\n URL = " + currentTabURL); 
    alert ("TAB ID = " + currentTabId + "\n URL = " + currentTabURL); 
}  

});

3 (현재 아이디 = 0 CURRENTURL = null)와 다음 경고 2가 실행되었다과 전류 (ID)의 정확한 값과 현재 URL 4 다음 경고

+0

아니기 때문에. 그것은 다른 문제입니다. https://stackoverflow.com/questions/26096646/flow-sequence-in-chrome-extension – Xan

+0

미안하지만 회신을받지 못했습니다 !! 더 자세히 설명해 주시겠습니까? –

+0

알았어. 다른 경고문들에 관한 것이 아니라 실행될 때 CurrentTabURL과 CurrentTabIf에 초기화 될 기회를주는 경고 3이다. 경고문을 사용하는 대신 동일한 작업을 수행 할 수 있습니까? –

답변

0

좋아, 그건 흥미로운 질문이 실행 경로가 경고했습니다 찾을 수 지금. 나는 중복 투표를 철회합니다. 비동기식 - 실행 기능은 주 실행 스레드 복귀 후에 실행하면서

setTimeout(function() { 
 
    alert("C"); // Should be next in queue for execution 
 
}, 0); 
 
alert("A"); 
 
alert("B");
예상대로

, 그것은, 시퀀스 A, B, C를 출력한다 :

이 코드를 고려한다. alert("A") 은 스레드을 차단하지만 아직 함수가 반환되지 않으므로 다음 실행 된 문은 alert("B")입니다.

그러나 브라우저가 alert에 차단되어있는 동안 Chrome API가 실행을 가로채 릅니다.

(다음 조각은 크롬 확장의 배경 페이지의 컨텍스트에서 실행해야합니다) 고려 :

chrome.tabs.query({}, function() { 
    alert("C"); // Should be in queue for execution after results are available?.. 
}); 
alert("A"); 
alert("B"); 

첫 번째 줄은 크롬에서 네이티브 코드 조작을 호출하고 결과에 대한 핸들러를 등록합니다.

두 번째 줄은 실행을 차단합니다. 일반적으로 이는 일반적으로 모든 것이 중지됨을 의미합니다. 대신이 시점에서 Chrome은 query 콜백을 실행합니다!

따라서 결과는 시퀀스 A, C, B입니다.

그것은이 밖으로의 큐 실행이 자신의 별도의 큐가 발생하지 않는 것을 관찰 할 수있다 :

chrome.tabs.query({}, function() { 
    setTimeout(function(){ 
    alert("C"); 
    }, 0); 
}); 
alert("A"); 
alert("B"); 

이 예상되는 A, B, C 순서를 제공 할 것입니다.첫 번째 경고가 표시되는 동안 핸들러가 호출되고 alert(C)을 주 "실행 큐"에 푸시합니다. 추가 테스트에서는 alert("A")이 처리기가 끝날 때까지 실제로 반환하지 않는다는 것을 보여줍니다.


이상한입니다.alert, confirmprompt 이외의 다른 기능이이 동작을 나타내며 Chrome API 외부에서 재생할 수 있는지 궁금합니다.

또한 의도적인지 궁금한 점이 무엇인지 궁금합니다. 어떤 종류의 (문서화되지 않은?) 교착 상태 방지? 해결 방법에 관해서는


- 디버깅 alert() 친구를 사용하지 마십시오. console.log()은 차단하지 않으며 예상대로 작동합니다.

배경 페이지의 콘솔을 보려면 chrome://extensions/; 팝업 창을 보려면 마우스 오른쪽 버튼으로 버튼을 클릭하고 "팝업 검사"를 선택하십시오.

+0

시도했지만 console.log() 및 더미 문 var x = 10 그러나 아무것도 작동하지 않습니다! ! –

+0

@DeepikaAnand 나는 당신이 말한 것에 대해 _ 혼란 스럽습니다. – Xan