【问题标题】:Javascript Chrome Extension Passing Variable From AJAX to Array [duplicate]Javascript Chrome扩展将变量从AJAX传递到数组[重复]
【发布时间】:2015-06-25 06:42:57
【问题描述】:

我正在编写一个调用谷歌翻译 api 的 chrome 扩展程序。一旦我得到翻译的单词,我想将它添加到一个数组中,但我相信它是异步的,我不确定如何将它传递给数组,以便它在主线程上可用。

  var translatedWords = ["hola"];
  var text = "what";
  var key="******************";
  var source="en";
  var dest="es";


  $.ajax({
type: "GET",
url: "https://www.googleapis.com/language/translate/v2key="+key+"&source="+source+"&target="+dest+"&q="+text
}).done(function(response) {

//SET Translated word
var WordTranslated = response.data.translations[0].translatedText;

//populate into array
translatedWords.push(WordTranslated);

}).fail(function(response) {
console.log("FAILURE: " + JSON.stringify(response));
});


console.log("translatedWords " + JSON.stringify(translatedWords));

这个输出

translatedWords ["hola"] 

它现在应该在哪里

translatedWords ["hola","que"]

我怎样才能做到这一点?谢谢!

【问题讨论】:

  • 将 console.log 放入 done 处理程序中。
  • 有没有办法在 done 处理程序之外访问响应?这就是我的 background.js 中的全部内容,我在脚本的其他地方对我的 translateWords 数组进行了很多调用。
  • 一旦收到这些词,它们就会在您的 translateWords 数组中。将 console.log 放在 done 处理程序中只是为了向您显示请求正在工作。
  • 所以我遍历了选项页面中的数组,但它只显示了一项。我像这样访问它 var background = chrome.extension.getBackgroundPage(); var translateWords = background.translatedWords;我有什么特别需要做的吗?
  • 我应该用 set 保存数组然后进入我的选项页面吗?

标签: javascript ajax google-chrome-extension google-translate


【解决方案1】:

这不是 chrome 扩展的问题,这是 ajax 请求中的回调问题。当您调用 $.ajax 时,响应是异步的。这意味着它不会等待返回,直到它返回继续执行您的方法。所以你的操作顺序是:

  1. 进行ajax调用
  2. 运行 console.log 语句
  3. Ajax 语句返回,运行成功

您需要将依赖于结果的逻辑放入实际的成功回调中,如下所示:

$.ajax({
    type: "GET",
    url: "https://www.googleapis.com/language/translate/v2key="+key+"&source="+source+"&target="+dest+"&q="+text
}).done(function(response) {
    //SET Translated word
    var WordTranslated = response.data.translations[0].translatedText;

    //populate into array
    translatedWords.push(WordTranslated);

    console.log("translatedWords " + JSON.stringify(translatedWords));

    //Any other logic here as well
}).fail(function(response) {
    console.log("FAILURE: " + JSON.stringify(response));
});

【讨论】:

  • 谢谢布赖恩。那么如果我想在其他地方使用填充的数组怎么办?说当用户单击导航栏中的图标时出现在弹出窗口中。
  • 您必须将其存储在适当范围的变量中。这实际上取决于您的代码/页面的结构。
猜你喜欢
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多