如何将 AJAX 成功变量存储为 AJAX 之外的变量?

2024-02-04

我使用 AJAX 来获取我命名为变量 myPubscore 的数据。现在我尝试将 myPubscore 发送到另一个 js 文件。 myPubscore 在 Ajax 中打印得很好,但是当我在 sendResponse 之前打印时,我收到“事件处理程序中的错误:ReferenceError:myPubscore 未定义”。

如何将 myPubscore 从 AJAX 中取出并放入 sendResponse 中?我阅读了关于这个问题的另一篇 SO 帖子,但受访者提到答案已经贬值。

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    if (request.type == "articleUrl") {
        console.log("background heard articleUrl")
        console.log(request);
        var articleUrl = request;
        $.ajax({
        type: 'POST',
        url: `${url}/buttoncolor`,
        data: articleUrl,
        success: function urlFunction(data) {
        var myPubscore = data;
        console.log("myPubscore in ajax:")
        console.log(myPubscore);
        }
        })
    console.log("myPubscore in sendresponce:")
    console.log(myPubscore);
    sendResponse({score: "myPubscore"});
    }

更新了background.js

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    if (request.type == "articleUrl") {
        console.log("background heard articleUrl")
        console.log(request);
        var articleUrl = request;
        $.ajax({
        type: 'POST',
        url: `${url}/buttoncolor`,
        data: articleUrl,
        success(data){
            console.log("incoming data");
            console.log(data);
            sendResponse(data);
            console.log("sent data");
            },
        });
        return true;
    }

内容.js

        chrome.runtime.sendMessage({ "type": "articleUrl", "url": url }, function (response) {
            console.log("here's the response for sending the URL");
            console.log(response);
        });

当使用像这样的异步调用时$.ajax or fetch or XMLHttpRequest,它的回调会在未来很晚的时间运行,此时周围的作用域已经运行,因此您需要使用回调内的调用结果,如中所述如何从异步调用返回响应? https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call

Chrome 中扩展消息传递的重要补充

在 Chrome 中,onMessage API 事件无法识别侦听器返回的 Promise,因此为了能够异步使用 sendResponse,您需要返回true从 onMessage 侦听器并在 ajax 回调中调用 sendResponse:

chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  if (request.type === 'articleUrl') {
    $.ajax({
      url: '...........',
      success(data) {
        sendResponse(data);
      },
    });
    return true;
  }
});

or

chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  if (request.type === 'articleUrl') {
    fetch('https://www.example.org').then(r => r.text()).then(sendResponse);
    return true;
  }
});

async关键词注释

请注意,您不能使用以下标记来标记 onMessage 侦听器async返回时的关键字true因为它实际上会返回一个Promise反对该 API,Chrome 扩展 API 不支持该 API。在这种情况下,使用单独的异步函数或异步 IIFE,example https://stackoverflow.com/a/53024910.

附:如果你使用WebExtension 填充 https://github.com/mozilla/webextension-polyfill/您可以从 onMessage 监听器返回一个 Promise 并使用async直接充当监听器。在 Firefox 中,这就是 API 开箱即用的工作方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 AJAX 成功变量存储为 AJAX 之外的变量? 的相关文章

随机推荐

  • 将 List 拆分为连续数字组[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有一个排序的List
  • 使用 aws-cli 将 URL 保存到 AWS 参数存储

    好吧 所以我尝试以编程方式将无服务器生成的 API 端点存储在参数存储中 以供另一个项目摄取 举个例子 我将尝试存储 google com aws ssm put parameter name dev someStore value htt
  • 与 CollectionViewSource 绑定

    我正在尝试使用 CollectionViewSource 实现一些组合框排序 该组合框实际上是数据模板的一部分 并在列表视图中重复出现 我的第一种方法似乎有效 使用 CollectionViewSource 但我的所有组合框共享相同的数据上
  • 如何在 Greasemonkey 中替换链接的目标?

    我正在尝试在 Greasemonkey 中编写一个脚本 将链接的目标替换为其他内容 但由于我有限的 Javascript 知识 我真的不知道如何做到这一点 基本上我试图找到包含特定字符串的所有链接 例如 a contains href xx
  • 如何在 Struts 2 的 OGNL 表达式语言中包含 HTML

    我正在研究 struts 2 我正在做一个projection我的 JSP 页面中使用 OGNL 表达式语言的集合 我有 1 个基于列表的集合action类 我在 JSP 页面上访问该类 如下所示
  • 如何使用凭证配置文件通过 AWS CLI 登录

    我想设置多个 AWS 配置文件 以便在项目之间跳转时可以轻松更改设置和凭证 我已阅读 AWS 文档 但关于如何选择登录时要使用的配置文件非常模糊 当我尝试登录时 它只是给我这个错误 这似乎表明它没有获取任何凭据 An error occur
  • 模块联合无法在 webpack.config.js 中动态挂接远程

    当我在 index html 中预先加载遥控器时 我已经进行了模块联合设置并且工作正常 下面的作品 index html div div host webpack name home library type var name home f
  • pybind11、cmake:如何安装文件?

    我正在将 C 库与越来越流行的接口连接起来pybind11 https github com pybind pybind11获取本机 Python 绑定 配置是通过CMake My CMakeLists txt好像 cmake minimu
  • Docker 构建时出现“组织已启用或强制执行 SAML SSO。要访问远程:此存储库”错误

    FROM golang 1 17 alpine as builder ENV GOPRIVATE github com XXXXX ARG GITHUB TOKEN GITHUB TOKEN RUN apk update apk add g
  • HTML/CSS 显示/隐藏多个元素?

    我正在寻找一个 HTML CSS 解决方案来应对这一挑战 我有多个具有相同类或相同 id 的元素 并且我想使用按钮或切换开关同时显示 隐藏它们 然后我有一个单击事件 当我单击代表所有这些元素的类或 ID 时 它们都会隐藏 当我再次单击时 它
  • Laravel 存储文件的公共 url

    我想检索使用存储的所有文件的公共网址 存储 putFile 公共 备件 所以 这是我正在使用的问题 存储 文件 公共 备件 但它提供了 laravel 存储目录的输出 public spares image1 jpg public spar
  • 应用程序退出后未设置剪贴板?

    以这个例子为例如何使用 Python 将字符串复制到 Windows 上的剪贴板 https stackoverflow com questions 579687 how do i copy a string to the clipboar
  • 我可以使用 Linux/Mono 部署 aspnet web 应用程序吗?

    我有一个 C ASP NET 应用程序 可以在带有 IIS 的 Windows 上运行 但最近我很想切换到 Linux Mono 它提出了一些问题 我可以在 Mono 中正确运行我的 Visual Studio 项目和源代码吗 我的客户使用
  • 无法运行growl通知并且gemgrowl_notify抛出错误

    当我运行 guard 时 我无法收到咆哮通知 我需要growl notify 的任何特定版本吗 咆哮版本 1 2 这是我的宝石文件 gem rails 3 1 3 gem sqlite3 group development test do
  • 如何按值对计数器进行排序? - Python

    除了进行反向列表理解的列表理解之外 是否有一种Pythonic方法可以按值对Counter进行排序 如果是这样 它比这个更快 gt gt gt from collections import Counter gt gt gt x Count
  • 如何加载和解析 SVG 文档

    背景 有许多与读取和解析 SVG 路径相关的未解答问题 用Java读取svg路径数据的最简单方法 https stackoverflow com questions 21973777 回复 使用 batik svg 解析器解析 svg 文件
  • 如何获取 Invoke-AzureRmVMRunCommand 命令的输出流?

    我正在尝试运行以下命令 Invoke AzVMRunCommand ResourceGroupName instance ResourceGroupName Name instance Name CommandId RunPowerShel
  • Sequelize 设置时区进行查询

    我目前正在使用续集 with postgres在我的项目中 我需要更改查询 因此它返回带有时区偏移量的created at列 var sequelize new Sequelize connStr dialectOptions useUTC
  • DynamoDB query() 与 getItem() 基于索引进行单项检索

    如果我根据索引哈希键从表中检索单个项目 两者之间是否存在性能差异query or getItem getItem会更快 getItem通过哈希和范围键检索是 1 1 匹配 检索它所需的时间 因此性能 受到内部哈希和分片的限制 查询结果是对
  • 如何将 AJAX 成功变量存储为 AJAX 之外的变量?

    我使用 AJAX 来获取我命名为变量 myPubscore 的数据 现在我尝试将 myPubscore 发送到另一个 js 文件 myPubscore 在 Ajax 中打印得很好 但是当我在 sendResponse 之前打印时 我收到 事