sendResponse 不等待异步函数或 Promise 的解析[重复]

2024-05-17

我遇到了异步问题(我相信)。sendResponse() in 内容脚本.js不等待getThumbnails()回来。

我正在发送一个message in popup.js:

chrome.tabs.sendMessage(tabs[0].id, {message: "get_thumbnails", tabUrl: tabs[0].url},
      function (respThumbnails) {
            const thumbUrl = respThumbnails.payload;
            console.log("payload", thumbUrl)   
      }
);

然后,在内容脚本.js I listen对于此消息:

chrome.runtime.onMessage.addListener(async function(request,sender,sendResponse) {
    if(request.message === "get_thumbnails") {
        const payload = await getThumbnails();
        console.log("thumbPayload after function:", payload)
        sendResponse({payload:payload});   
    }
});


async function getThumbnails() {
    let tUrl = null;
    var potentialLocations = [
        {sel: "meta[property='og:image:secure_url']",   attr: "content" },
        {sel: "meta[property='og:image']",              attr: "content" },
    ];

    for(s of potentialLocations) {
        if(tUrl) return
        const el = document.querySelector(s.sel);
        if(el) {
            tUrl = el.getAttribute(s.attr) || null;
        } 
    }
    return tUrl;
};

但也有可能问题出在我身上getThumnails()功能,因为大多数时候,有效负载为空并且不是未定义的。所以getThumbnails()可能会在完全执行之前返回。 如果是这样的话,我不知道为什么......

我也尝试过这段代码getThubnails():

async function getThumbnails() {
  let x = await function() {
    let tUrl = null;
    var potentialLocations = [
        {sel: "meta[property='og:image:secure_url']",   attr: "content" },
        {sel: "meta[property='og:image']",              attr: "content" },
    ];

    for(s of potentialLocations) {
        if(tUrl) return
        const el = document.querySelector(s.sel);
        if(el) {
            tUrl = el.getAttribute(s.attr) || null;
        } 
    }
    return tUrl;
  }
  return x;
};

但这不起作用,它似乎破坏了我的代码......


问题是你的监听器声明为async关键字,所以它返回一个Promise,不是字面意思true价值为required https://developer.chrome.com/extensions/runtime#event-onMessage通过 onMessage 实现,但是Chrome在ManifestV3和V2中的onMessage监听器的返回值中仍然不支持Promise,报告于https://crbug.com/1185241 https://crbug.com/1185241。你返回的 Promise 被忽略,端口立即关闭,调用者收到undefined作为回应。

解决方案

去除async之前的关键字(request, sender, sendResponse), 然后...

解决方案1致电async可以作为 IIFE 嵌入的函数:

chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  if (request.message === "get_thumbnails") {
    (async () => {
      const payload = await getThumbnails();
      console.log("thumbPayload after function:", payload)
      sendResponse({payload});
    })();
    return true; // keep the messaging channel open for sendResponse
  }
});

解决方案2声明一个单独的async函数并从 onMessage 监听器调用它:

chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
  if (msg.message === "get_thumbnails") {
    processMessage(msg).then(sendResponse);
    return true; // keep the messaging channel open for sendResponse
  }
});

async function processMessage(msg) {
  console.log('Processing message', msg);
  // .................
  return 'foo';
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sendResponse 不等待异步函数或 Promise 的解析[重复] 的相关文章

随机推荐

  • 如何通过 Android 中小部件上的按钮运行活动?

    我正在开发一个由按钮组成的切换小部件 当按下时 我希望它运行一个活动而不打开任何东西 只是像往常一样在桌面上说 有没有办法通过桌面小部件上的按钮直接运行活动 谢谢 更新 现在我尝试在代码中切换静默模式而不运行新的活动 这是我当前的代码 当我
  • Rust 为什么要费心“let”? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我对 Rust 很感兴趣 所以我开始阅读 Rust 网站上的 Rust 编程指南 发现变量是通过以下方式声明的 let x i32 5 这意味着
  • Linux 中的无缓冲 I/O

    我正在写入大量的数据 这些数据数周内都不会再次读取 由于我的程序运行 机器上的可用内存量 显示为 空闲 或 顶部 很快下降 我的内存量应用程序使用量不会增加 其他进程使用的内存量也不会增加 这让我相信内存正在被文件系统缓存消耗 因为我不打算
  • 循环中的 let 语句在 IE 中无法按预期工作

    我正在尝试 ECMAScript 6 中的一些示例 与其他浏览器相比 它的工作方式有所不同 这返回true在 Firefox 中 但它返回false在IE中 为什么这在 Internet Explorer 中的工作方式有所不同 let ca
  • Anaconda - 箭头键在 python shell 中不能正常工作

    I installed Anaconda3 on manjaro with i3wm and Urxvt When I go into python interpreter it is OK to type python script an
  • Select2 有 10.000 多个元素时打开速度很慢

    我正在使用 Select2 来填充下拉菜单 Select2如果底层选择有相当数量的项目 则打开下拉菜单时会很慢 我的下拉列表中有超过 10 000 个元素 这是我的代码 ajax url Companies GetCompanies met
  • 有没有办法在 CMake 配置中禁止“实验性”C++17?

    我在 CMakeLists txt 中设置了以下内容 set CMAKE CXX STANDARD 17 set CMAKE CXX STANDARD REQUIRED ON set CMAKE CXX EXTENSIONS OFF 然而
  • MySQL LIKE %string% 不够宽容。我还有什么可以用的吗?

    我有一位客户询问他们的搜索是否可以搜索公司名称 这些名称可以根据用户输入以多种格式进行搜索 例如数据库中存储的公司是 A J R Kelly Ltd 如果用户搜索 一个 J R Kelly 被发现 使用
  • 在哪里可以找到config.vm.boot_timeout?

    您好 我想编辑 vagrant 中的 config vm boot timeout 因为我在启动 vagrant 时遇到问题 我在哪里可以找到 config vm boot timeout 我应该输入什么值 我在windows8 1 x86
  • Javascript - 检测 Youtube 默认缩略图

    有什么方法可以查看 Youtube 缩略图是否真的存在 或者 Youtube 只是用默认缩略图替换了它 例如 没有此缩略图的视频 http img youtube com vi G75WApUdYJ4 maxresdefault jpg h
  • 错误 build.gradle 与 com.google.android.gms:play-services-maps:9.4.0

    在我的应用程序中 我有这些依赖项 apply plugin com android application android compileSdkVersion 23 buildToolsVersion 23 0 2 defaultConfi
  • 需要可见元素的 xpath 定位器

    我正在尝试对我的网站进行测试 在某些用户表单上遇到问题 诀窍是 表单中文本字段的数量根据用户选项的不同而变化 代码中存在禁用的文本字段 但样式为 displayed none gt 标签 所以我试图找到比逐一定位每个元素并用 try exc
  • 属性文件中的特殊字符

    在我的 Java Spring Web 应用程序中 我在打印从属性文件检索的意大利语特殊字符 等 时遇到问题 我找到了这篇文章http docs oracle com cd E26180 01 Platform 94 ATGProgGuid
  • 重命名多索引列名称Python

    我有一个如下所示的 MultiIndex Dataframe df Office Office x True 2 y False 3 z True 5 如果我重置 df reset index 它将错误为 cannot insert Off
  • 从 JSON 文件注入的编译指令 AngularJS

    希望有人能帮助我应对这一挑战 我使用以下命令从服务器请求 JSON 数据 http get 来自服务器的数据返回一个对象 对象中的一个值包含 HTML 标记 该标记使用以下方式注入到页面中 div div 在标记内 有一个名为的自定义指令
  • lambda 表达式的“类型”可以表达吗?

    将 lambda 表达式视为可调用对象的 语法糖 是否可以表达未命名的基础类型 一个例子 struct gt bool operator int l int r return l gt r Now int l int r return l
  • 使用 Mockito 模拟文件、FileReader 和 BufferedReader 类

    我在我想测试的方法中得到了下面的代码 File f map get key1 BuffereReader r new BufferedReader new FileReader f String line null do line r re
  • 如何确定 R 包的作者?

    如何确定包的作者是谁 鉴于我们拥有这个广泛使用的代码库 我认为参考我在分析中使用的软件是合适的 有没有办法以编程方式检索作者和任何其他相关信息 在伪代码中 我想执行以下操作 references base 我怎样才能做到这一点 为了能够引用
  • 在 Blazor 中读取和显示嵌套类/表中的数据的最佳方法是什么?

    主要目标 我正在创建一个 Blazor 应用程序 它将一次显示报告的一个段落 用户需要单击某个按钮才能转到报告的下一段 我需要创建一个数据库 其中包含段落 节标题和文档的表格 我的问题 我的问题与数据库部分以及如何从数据库读取数据的方式有关
  • sendResponse 不等待异步函数或 Promise 的解析[重复]

    这个问题在这里已经有答案了 我遇到了异步问题 我相信 sendResponse in 内容脚本 js不等待getThumbnails 回来 我正在发送一个message in popup js chrome tabs sendMessage