Javascript Chrome扩展中的异步JS
我不知道如何异步使用Chrome扩展代码。他们说 chrome.*API中的大多数方法都是异步的:它们会立即返回,而无需等待操作完成。如果需要知道该操作的结果,则向该方法传递回调函数。在方法返回后的某个时间执行回调(可能要晚得多) onJavascript Chrome扩展中的异步JS,javascript,google-chrome,asynchronous,google-chrome-extension,Javascript,Google Chrome,Asynchronous,Google Chrome Extension,我不知道如何异步使用Chrome扩展代码。他们说 chrome.*API中的大多数方法都是异步的:它们会立即返回,而无需等待操作完成。如果需要知道该操作的结果,则向该方法传递回调函数。在方法返回后的某个时间执行回调(可能要晚得多) onexecuteScript似乎表明它是异步的,因为它接受一个回调,该回调被称为“在所有JavaScript执行之后” 尽管我意识到了这一切,但我还是很难弄清楚如何利用脚本执行对我有利 下面是我在example.js中看到的内容: var firstWords =
executeScript
似乎表明它是异步的,因为它接受一个回调,该回调被称为“在所有JavaScript执行之后”
尽管我意识到了这一切,但我还是很难弄清楚如何利用脚本执行对我有利
下面是我在example.js中看到的内容:
var firstWords = "data:text/csv";
document.addEventListener('DOMContentLoaded', function() {
chrome.tabs.query({ currentWindow: true }, function(tabs) {
tabs.forEach(function(tab) {
chrome.tabs.executeScript(tab.id, { file: "getFirstWord.js" }, function(result) {
console.log("result of executeScript: ", result);
firstWord = result[0];
firstWords += firstWord;
console.log("firstWords: ", firstWords)
});
console.log("AFTER EXECUTESCRIPT firstWords: ", firstWords)
});
console.log("AFTER FOREACH firstWords: ", firstWords)
});
console.log("AFTER QUERY firstWords: ", firstWords)
});
console.log("AFTER EVERYTHING firstWords: ", firstWords)
console.log("hello from getFirstWord.js");
document.title.match(/\w*/)[0]
在getFirstWord.js
中:
var firstWords = "data:text/csv";
document.addEventListener('DOMContentLoaded', function() {
chrome.tabs.query({ currentWindow: true }, function(tabs) {
tabs.forEach(function(tab) {
chrome.tabs.executeScript(tab.id, { file: "getFirstWord.js" }, function(result) {
console.log("result of executeScript: ", result);
firstWord = result[0];
firstWords += firstWord;
console.log("firstWords: ", firstWords)
});
console.log("AFTER EXECUTESCRIPT firstWords: ", firstWords)
});
console.log("AFTER FOREACH firstWords: ", firstWords)
});
console.log("AFTER QUERY firstWords: ", firstWords)
});
console.log("AFTER EVERYTHING firstWords: ", firstWords)
console.log("hello from getFirstWord.js");
document.title.match(/\w*/)[0]
不出所料,结果并非我所希望的:
AFTER EVERYTHING firstWords: data:text/csv
AFTER QUERY firstWords: data:text/csv
AFTER EXECUTESCRIPT firstWords: data:text/csv
AFTER EXECUTESCRIPT firstWords: data:text/csv
AFTER EXECUTESCRIPT firstWords: data:text/csv
AFTER FOREACH firstWords: data:text/csv
result of executeScript: ["Asynchronous"]
firstWords: data:text/csvAnsynchronous
result of executeScript: ["Washington"]
firstWords: data:text/csvAnsynchronousWashington
result of executeScript: ["Chicago"]
firstWords: data:text/csvAnsynchronousWashingtonChicago
最终目标是积累所有所需数据的字符串(并转换为CSV)
是否有某种.done
类型的方法或其他方法来使用回调,以便在查询完成后可以实际使用累积的结果?相关的可能重复:虽然您使用的API是特定于Chrome扩展的,但这些异步函数的工作方式没有什么特殊之处。它们与大多数其他异步函数一样工作。有各种各样的语义可以帮助您如何处理这个问题,或者如何概念化异步函数。但是,如果您想编写执行各种重要功能和情况(例如GUI交互、真实世界界面、多处理…)的代码,并使用多种不同的计算机语言,您需要能够理解异步函数是如何工作的。forEach
callback有一个索引参数,因此只需检查它是否是最后一个参数,在这种情况下,您可以在executeScript的回调中执行所需的操作。chrome.*API提示:所有可能接受函数回调作为参数的方法(完整列表见文档)都是异步的。我建议使用and代替回调,而不是forEach。