Javascript Chrome扩展-如何从回调中执行的脚本返回承诺值
Background.js: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
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
值。