等待chrome.tabs.query回调的最佳方法是什么?

pro*_*o-n 0 javascript google-chrome-extension

我正在编写一个Chrome扩展程序供我自己使用.我正在从注入的脚本中查询当前选项卡的索引,如下所示:

[注入脚本]

chrome.runtime.sendMessage({whatIsMyIndex:1}, function(response){
   var myIndex = response.index;
});
Run Code Online (Sandbox Code Playgroud)

[后台脚本]

chrome.runtime.onMessage.addListener(
   function(request, sender, sendResponse) {
      if (request.whatIsMyIndex){
         sendResponse({index: sender.tab.index});
      }
   }
);
Run Code Online (Sandbox Code Playgroud)

现在这一切都很好,但是我还需要返回第一个标签的url:

[注入脚本2]

chrome.runtime.sendMessage({whatIsMyIndex:1}, function(response){
   var myIndex = response.index;
   var url = response.url;
});
Run Code Online (Sandbox Code Playgroud)

[后台脚本2]

var url;

//this uses sendResponse when the requested values arrive
function respond(sendResponse, index){
   if(typeof(url)!="undefined"){
      sendResponse({index:index, url:url});
   } else {
      setTimeout(respond, 15, sendResponse, index);
   }
}

chrome.runtime.onMessage.addListener(
   function(request, sender, sendResponse) {
      if (request.whatIsMyIndex){
         chrome.tabs.query({index:0, currentWindow:true}, function(tabs){
            url=tabs[0].url;
         }
         setTimeout(respond, 15, sendResponse, sender.tab.index);
         return true; //so i can use sendResponse later
      }
   }
);
Run Code Online (Sandbox Code Playgroud)

现在,这段代码工作得很好.我的问题是,有没有办法在不需要setTimeout的情况下实现这一目标?添加固定的15ms延迟似乎不对.

如果我能得到chrome.tabs.query的回调以把我的sendResponse()作为参数......

(将sendResponse()存储在全局变量中是不可能的,因为将有~20个选项卡同时执行此操作,并且所有这些选项卡都需要自己的响应.)

我这里不需要任何工作(或不工作)代码,只需要一些想法/指导.

rsa*_*hez 7

只需调用回调sendResponse内部chrome.tabs.query,而不是设置变量:

chrome.runtime.onMessage.addListener(
   function(request, sender, sendResponse) {
      if (request.whatIsMyIndex){
         chrome.tabs.query({index:0, currentWindow:true}, function(tabs){
            sendResponse({index:sender.tab.index, url:tabs[0].url});
         });
         return true; //so i can use sendResponse later
      }
   }
);
Run Code Online (Sandbox Code Playgroud)

每次调用onMessage回调函数都会创建一个新的闭包,因此回调函数sendResponse内部tabs.query将绑定到正确的函数.