使用 Promise 时 SendResponse 失败

2024-01-04

在我正在构建的扩展中,单击按钮,就会从 ChromeUtils.js 发送请求

 return new Promise(function(fulfill,reject){
            var request = {
                type : "background.twitterRequestToken",
            };
            chrome.runtime.sendMessage(request, function(response) {

                if (response)
                {
                    fulfill(response);
                }
                else
                {
                    reject(response);
                }
            });
        });

到background.js,后者调用oauth Api来向远程服务器发送请求。

chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {

    console.log("background.js: " + JSON.stringify(request));

    var type = request.type;


    if (type == "background.twitterRequestToken")
    {
        oauth.authorize().then(function(token,secret,userId,screenname){
            console.log("Sending Response on Authorize");
            sendResponse({success:true,userId:userId,screenName:screenname});
        });
        console.log("Before Return true");
        return true;
    }

我正在使用以下示例中的 oauth 脚本https://developer.chrome.com/extensions/tut_oauth https://developer.chrome.com/extensions/tut_oauth但由于要求修改了 oauth 以使用 Promise。当作为 Promise 实现时,sendResponse 会失败,但是当使用回调的默认实现时。 sendResponse 会通过。

使用回调的默认实现:

if (type == "background.twitterRequestToken")
    {
        oauth.authorize(function(token,secret,userId,screenname){
            console.log("Sending Response on Authorize");
            sendResponse({success:true,userId:userId,screenName:screenname});
        });
        console.log("Before Return true");
        return true;
    }

当作为承诺实现时,后台控制台中的错误消息是

Uncaught (in promise) Error: Attempting to use a disconnected port object

我想使用 Promise 的原因是,当使用 Oauth 发送signedRequests 时,我想在 sendResponse 中包含部分 xhr 响应,例如如下所示。

if (type == "background.tweet")
{
    var status = request.tweet.text;
    var url = "https://api.twitter.com/1.1/statuses/update.json";
    var request = {
        'method':'POST',
        'parameters': {
            'status':status
        }
    }

    oauth.sendSignedRequest(url,request).then(signedRequestCallback).then(function(resp,xhr){
        console.log("signedRequestCallback success");
        console.log("Sending response");
        sendResponse({success:true,status_id:resp.id});
    });

    return true;

}

我已经在我的代码中包含了 return true ,正如我所解释的,它在不使用 Promise 时工作得很好。使用 Promise 时会失败,因为我包含了错误消息。

===============更新========

为了重现这一点,我创建了一个更简单的示例,但是当我使用 Promise 时,我不会遇到这个问题。所以这可能和Promise没有任何关系。


None

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

使用 Promise 时 SendResponse 失败 的相关文章

随机推荐

  • 无法将下一个js部署到azure

    我正在尝试将我的 NEXTJS 应用程序部署到 azure 我使用安装了 Node 的 Linux 操作系统创建了一个 Web 应用程序 我的package json看起来像这样 name frontend version 1 0 0 de
  • 使用同一个ajax调用打开多个动态链接

    我正在显示多个使用相同的动态链接 ajax加载第一个链接上的内容很好 但不适用于其余链接 如何让它加载同一div中其他链接的内容 Html string a href link name name a div div Jquery href
  • 使用 GoogleMap 或 MapBox Direction API 在我的应用程序中实现我自己的导航

    我想在我的 Android 应用程序中为驾驶员实现导航地图 我不想使用 URL 方案打开 google 地图应用程序来导航 我更喜欢在我的应用程序中实现此导航功能 就像 Google 地图一样 我的要求很简单 将用户从一个地方导航到另一个地
  • shouldComponentUpdate 并非从未被调用

    请看一下我的代码 我尝试限制给定无状态组件的重新渲染 但这样做发现 shouldComponentUpdate 永远不会被调用 我已经从 styledComponents 中删除了包装器 之前有人报道过这种情况 但仍然绝对没有被调用 除此之
  • 在 JavaScript 中迭代带有“洞”的数组

    我有一个数组 其中一些项目将被删除 但有些循环仍在运行 所以我想简单地跳过删除对象的地方 我知道 for i in array 的语法应该执行此操作 因为它会迭代索引 但是我应该如何删除我的项目呢 因为当我执行 array 4 null 时
  • 查看pdf时隐藏或修改Webview2的工具栏

    我正在使用新的 Webview2 控件在 WPF 应用程序中呈现 Pdf 文件 这运行良好 但我想自定义工具栏以隐藏例如某些条件的保存按钮 我没有找到直接从 Webview2 CoreWebView2 对象执行此操作的方法或属性 但是 如果
  • 尝试调用自定义过滤器会导致“错误 TS2349:无法调用类型缺少调用签名的表达式”

    我试图从 Angular 控制器调用自定义过滤器 但收到错误 无法调用类型缺少调用签名的表达式 我在我从事的上一个项目中是这样实现的 所以我不知道哪里出了问题 此时过滤器不包含任何逻辑 因为我需要先编译它 这是过滤器
  • 用带孔的多边形制作 sf 对象并设置 crs

    With contourLines 我已经提取了数据的 95 轮廓 我想用正确的 crs 制作一个 sf 对象 虽然我无法分享我的实际数据集 但我改编了一个示例SO post https stackoverflow com question
  • Codeigniter ajax使用ajax代码将数据发送到控制器

  • 如何在 WinRT 8.1 上 P/调用 kernel32.dll

    我正在尝试使用本机 API 方法 GetNativeSystemInfo 在 Windows 8 1 上标记为支持手机和桌面应用商店应用程序 在文档中 它被列为存在于 kernel32 dll 中 伟大的 所以我对 P Invoke 的第一
  • Android:如何使用 AlarmManager

    我需要在 20 分钟后触发一段代码AlarmManager正在设置 有人可以向我展示有关如何使用的示例代码吗AlarmManager在 Android 中 我已经研究了一些代码几天了 但它不起作用 一些示例代码 并不是那么容易AlarmMa
  • 停止运行 PHP 服务器,命令行

    所以我已经做到了php S localhost 8000 但我不再需要它了 我需要找回我的 8000 localhost 如何停止php服务器 killall 9 php 我就是这么做的
  • Coq 无法在 Z 上计算有根据的函数,但它可以在 nat 上运行

    我正在 为我自己 写一篇关于如何在 Coq 中进行有根据的递归的解释 参见 Coq Art 书 第 15 2 章 首先我做了一个基于的示例函数nat效果很好 但后来我又做了一次Z 当我使用Compute来评估它 它并没有一直降低到Z价值 为
  • 为什么 Android Studio 告诉我使用 getSupportActionBar() 而不是 getActionBar()?

    只需在这个新奇的 Android Studio 0 8 6 beta 中将一个非常简单的帮助活动 仅显示资源文件中的 HTML 文本块 添加到一个非常简单的测试应用程序中 我就会收到以下警告 但没有提供的理由 理由 有谁知道为什么 还有是否
  • 如何将 url 中的变量传递给 Django 列表视图

    我有一个 Django 通用列表视图 我想根据输入 URL 的值进行过滤 例如 当有人输入 mysite com defaults 41 时 我希望视图过滤所有与 41 匹配的值 我遇到过一些使用基于函数的视图来执行此操作的方法 但没有使用
  • HTML5显示上传的图像直到下一张上传?

    我不确定是否应该为此使用 HTML5 存储 我的问题是如何实现以下目标 想象一下博物馆里有一面空框架的墙 我希望用户从他或她的计算机上传图像 该图像将显示在墙上的框架中 div 如果用户想要检查另一个图像 可以 删除 前一个图像 然后应该显
  • 正则表达式排除某些标签

    只是需要快速帮助来解决这个问题 我想从字符串中删除除白名单 变量 中的标签之外的所有 html 标签 到目前为止我的代码 whitelist p br ul li strike em strong a reqExp new RegExp l
  • 当 UIButton 获得焦点时,Siri Remote 的菜单按钮不会退出应用程序

    我凌驾于一切之上pressesBegan接收选择按下 当焦点位于某个对象上时 Siri 远程菜单按钮不会退出我的应用程序UIButton 如果没有 UI 元素获得焦点 菜单按钮将按预期工作 当焦点位于某个位置时 如何接收菜单按钮按下的消息U
  • SQL Server 更新值 XML 节点

    我在 SQL Server 中有 2 个表 Table1 ID Name Phone 1 HK 999 2 RK 888 3 SK 777 4 PK 666 Table2 ID XMLCol 1 XMLVal1 XMLVal1
  • 使用 Promise 时 SendResponse 失败

    在我正在构建的扩展中 单击按钮 就会从 ChromeUtils js 发送请求 return new Promise function fulfill reject var request type background twitterRe