Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Chrome扩展中的异步JS_Javascript_Google Chrome_Asynchronous_Google Chrome Extension - Fatal编程技术网

Javascript Chrome扩展中的异步JS

Javascript 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 =

我不知道如何异步使用Chrome扩展代码。他们说

chrome.*API中的大多数方法都是异步的:它们会立即返回,而无需等待操作完成。如果需要知道该操作的结果,则向该方法传递回调函数。在方法返回后的某个时间执行回调(可能要晚得多)

on
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。