Foxfire 웹 확장을 작성하려고합니다. 탭의 URL을 반환하는 함수를 원합니다.
파이어 폭스 탭
browser.tabs.get(id)
URL이있는 멤버가있는 탭 오브젝트로 해석되는 약속을 리턴합니다. 와이즈 비즈
탭의 ID를 포함하는 탭 배열로 해석되는 약속을 반환합니다.
계획은 tab.url로 해석되는 약속으로 위의 두 호출을 래핑합니다. async/await를 사용하여 결과가 해결 될 때까지 기다립니다.
MDN 설명서에 따르면 :
와이즈 비즈매니페스트 파일에는 탭 권한이 있습니다.
내 코드는 아래와 같습니다 :
browser.tabs.query
표시된 바와 같이 console.dir 및 console.log 문은 주석 처리됩니다. 코드를 디버깅하고 명령 줄을 사용하여 테스트 기능을 실행합니다. 테스트 기능에서 기다림이 약속이 해결 될 때까지 기다렸다가 값을 반환하도록 생각합니다.
그렇습니다. console.log 및 console.dir 문의 주석을 해제하면 명령 줄에서 테스트를 실행하면 예상 된 (url) 결과가 나타납니다. 콘솔에는 log/dir 문의 결과가 표시되며 명령 행에서 실행하면 최종 결과는 탭의 URL입니다 (test2의 console.dir에서 tab.id를 얻을 수 있음).
console.dir 문을 주석 처리하면 로그에 "Promise {:"pending "}"다음에 새 줄에 원하는 결과 (URL)가 나오는 줄이 나타납니다.
console.log 문을 주석 처리하면 "Promise {:"pending "}"줄만 나타납니다. 원하는 URL을 얻지 못했습니다.
누구라도 이것을 시도하려면 매니페스트 파일이 다음과 같습니다 :
"The await expression causes async function execution to pause until a Promise is fulfilled, that is resolved or rejected, and to resume execution of the async function after fulfillment. When resumed, the value of the await expression is that of the fulfilled Promise."
browser.browserAction.onClicked.addListener(test);
async function test(){
let res = await GetActiveTabURL();
//console.log(`test ${res}`);
return res;
}
async function test2(TabID){
let res = await GetTabURL(TabID);
//console.log(`test2 ${res}`);
return res;
}
function GetActiveTabURL() {
return new Promise((resolve, reject) => {
browser.tabs.query({currentWindow: true, active: true})
.then((tabs) => {
browser.tabs.get(tabs.pop().id)
.then((tab) => {
//console.dir(tab);
resolve(tab.url)
})
})
})
}
function GetTabURL(TabID) {
return new Promise((resolve, reject) => {
browser.tabs.get(TabID)
.then((tab) => {
//console.dir(tab);
resolve(tab.url)
})
})
}
- 답변 # 1
- 답변 # 2
이를 시도하십시오. async/await를 사용할 환경이 있다면 .then ()을 과도하게 사용하는 것이 좋습니다.
browser.browserAction.onClicked.addListener(test); async function test() { let res = await GetActiveTabURL(); return res; } async function test2(TabID) { let res = await GetTabURL(TabID); return res; } async function GetActiveTabURL() { const tabs = await browser.tabs.query({ currentWindow: true, active: true }); const tab = browser.tabs.get(tabs.pop().id); return tab.url; } async function GetTabURL() { const tab = await browser.tabs.get(TabID); return tab.url; }
관련 자료
- node.js - nodejs에서 비동기가있는 포크가 작동하지 않습니다
- javascript - 중첩 된 비동기 대기가 예상대로 작동하지 않습니다
- arrays - async 및 await가 올바르게 작동하지 않습니다
- javascript - 노드 J는 비동기 함수 내에서 작동하지 않기를 기다리고 있습니다
- c# - XamarinForms async/await 작업이 작동하지 않습니다
- node.js - nodejs 비동기는 하나의 변수에서 모든 데이터를 기다립니다
- javascript - Vuetify 규칙을 비동기로 만들고 아약스 호출로 기다리는 방법
- mysql - 비동기 대기 상태로 각각 삽입
- javascript - 여러 비동기 대기 호출을 만드는 방법
- flask - 이 경우 Javascript 비동기 대기가 작동하지 않는 이유는 무엇입니까?
- angular - 값 변경을 위해 템플리트에서 비동기 파이프와 결합 할 때 파이프 연산자가 작동하지 않음
- javascript - 비동기에서 Arraymap 체인을 기다리는 방법은 무엇입니까?
- reactjs - MySQL 시드에서 비동기 대기가 실행되지 않습니다
- javascript - async await promise 모든지도가 약속을 해결하지 못함
- c# - 비동기 대기 메소드는 대기 지점에서 UI를 차단합니다
- 반응 네이티브 비동기 대기 호출 반환 오류
- javascript - Nodejs API 호출에서 비동기 대기
- c# - 비동기 대리자를 올바르게 기다리는 방법?
- javascript - TestCafe 교체 async/await with promises
- javascript - try-catch&async는 js에서 변경 순서를 기다 립니까?
- javascript : 약속 내에서 setTimeout 후 약속 해결
- javascript : async/await 구문으로만 axios promise 모듈을 다시 작성하려면 어떻게 해야 합니까?
- javascript : 정의되지 않은 오류를 제공하는 약속을 거부하는 이유는 무엇입니까?
- 약속이 있는 Javascript 기능 성능 질문
- javascript : dom-to-image 라이브러리를 사용하여 순서대로 promise 결과를 반환합니다.
- javascript : 맵 변경 시퀀스의 비동기 대기
- javascript : 2개의 약속이 있는 함수는 하나만 해결될 때까지 기다립니다.
- JavaScript 서버 호출 -약속 기다림
- (Javascript 함수 결과를 다른 함수에서 매개변수로 사용하는 방법
- javascript : 노드 오류 TypeError: req.query.acct_stmt_id.map이 배열 크기에 따라 함수가 아닙니다.
비동기 함수가 약속을 반환해야한다는 문서에서 발견되었습니다. 모든 반환 진술. 약속을 포함하지 않은 return 문의 값은 위와 같이 무시됩니다. 분명히 함수의 마지막 약속이 반환됩니다.
알 수 있듯이 약속을 기다리는 함수는 해당 약속의 값을 반환 할 수 없습니다.
let xx = await promise의 값, xx는 await 문 다음에 동일한 함수에서 사용할 수 있으며 여기서 사용할 수 있습니다. 따라서 비동기 적으로 값을 반환하기 위해 함수를 호출하는 대신 호출 함수를 비동기로 만들고 원하는 값에 도달하기 위해 필요에 따라 일련의 대기를 사용해야합니다.