Javascript Chrome扩展-如何从回调中执行的脚本返回承诺值

Javascript Chrome扩展-如何从回调中执行的脚本返回承诺值,javascript,google-chrome-extension,tabs,Javascript,Google Chrome Extension,Tabs,Background.js: chrome.tabs.executeScript(tab.id, { file: "exec_script.js" }, function(res) { console.log(res); }); var test = html2canvas(document.body, { allowTaint: false, letterRendering: true, logging: true }).then(function (canva

Background.js:

chrome.tabs.executeScript(tab.id, 
{
    file: "exec_script.js"
}, function(res) {
    console.log(res);
});
var test = html2canvas(document.body, {
  allowTaint: false,
  letterRendering: true,
  logging: true
}).then(function (canvas) {
    var dataUrl = canvas.toDataURL();
    var bImage = dataUrl.replace('data:image/png;base64,', '');
});
test
exec\u script.js:

chrome.tabs.executeScript(tab.id, 
{
    file: "exec_script.js"
}, function(res) {
    console.log(res);
});
var test = html2canvas(document.body, {
  allowTaint: false,
  letterRendering: true,
  logging: true
}).then(function (canvas) {
    var dataUrl = canvas.toDataURL();
    var bImage = dataUrl.replace('data:image/png;base64,', '');
});
test
据我所知,exec_script.js中的最后一条语句必须作为结果参数传递给回调函数。但它返回空对象

但如果我在exec_script.js中做如下操作:

var test = "good";
test
它向回调返回变量的值


选项卡也没有焦点。

chrome.tabs.executeScript返回的结果是由执行脚本的主体生成的,换句话说,它是同步JavaScript的标准行为

在您的例子中,同步部分创建
test
对象,安排一个承诺但尚未执行(),将刚刚初始化的
test
对象作为最后一条语句,以便executeScript获取它。此外,由于executeScript只传输对象的JSON ifiable部分,并且
test
是一个复杂的类对象,因此会传输一个空对象。您可以通过检查控制台中的
console.log(JSON.stringify(test))
手动检查它

要传输异步代码的结果,请使用:

  • background.js

    chrome.runtime.onMessage.addListener(function(msg, sender, sendResponse) {
        console.log(sender.tab, msg);
        // do something
    });
    chrome.tabs.executeScript(tab.id, {file: "exec_script.js"});
    
  • exec_script.js

    var test = html2canvas(document.body, {
      allowTaint: false,
      letterRendering: true,
      logging: true
    }).then(function(canvas) {
        var dataUrl = canvas.toDataURL();
        var bImage = dataUrl.replace('data:image/png;base64,', '');
        chrome.runtime.sendMessage({dataUrl: dataUrl});
    });
    

注意:只有对象的JSON ifiable部分通过消息传递。

“但它返回空对象”您确定
res
是普通对象吗?您希望传递给回调的值是什么?我想在回调中看到“bImage”值。您是否尝试从
返回
bImage
。然后()
链接到
html2canvas
调用,链接
。然后()
在回调时链接到
res
?像这样?是的,我试过了。问题在于,
chrome.tabs.executeScript
在选项卡中的代码完成之前不会阻止扩展过程。
test
不会引用
bImage
test
是一个
Promise
。然后()
用于获取
Promise
值。