首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >承诺支持Chrome扩展API?

承诺支持Chrome扩展API?
EN

Stack Overflow用户
提问于 2017-02-13 01:46:37
回答 4查看 5.7K关注 0票数 17

在过去的几周里,我一直在编写一些浏览器扩展,直到今天,我一直认为火狐的WebExtension应该可以在Chrome中自动运行。因此,我尝试按照Mozilla的示例编写代码。

但今天我意识到,在Chrome扩展的API文档中并没有提到承诺。

我在所有扩展的代码中严格使用了Promises。

所以现在我的问题是,我的代码能在Chrome中运行吗?或者,如果我添加一个var browser = chrome在最上面的声明?

或者Chrome根本不支持API上的Promise?

如果Chrome还不支持API函数上的Promise,它会在未来支持它们吗?

注意,我知道这个项目:

https://github.com/mozilla/webextension-polyfill

但是我不愿意经历到处都包含这个库的麻烦。此外,它还包含令人讨厌的bug。

除此之外,我没有Chrome和Chromium,出于隐私和安全的原因,我不能安装它们。

编辑:

他们终于开始实现对promises的支持。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-02-23 02:46:07

官方承诺支持终于到来了,并且已经在一些API上实现了。在撰写本文时:

browserAction

曲奇

动作

窗口

存储

选项卡

管理

在GoogleChrome的Github上,你已经可以找到一个使用带有承诺(Await)的chrome.tabs应用程序接口的Hello world示例:

代码语言:javascript
复制
chrome.runtime.onInstalled.addListener(async () => {
  let url = chrome.runtime.getURL("hello.html");
  let tab = await chrome.tabs.create({ url });
  console.log(`Created tab ${tab.id}`);
});

如您所见,promise支持只是在chrome对象,它现在同时支持Promises和回调。Firefox仍然使用browser promise API的。

票数 7
EN

Stack Overflow用户

发布于 2017-06-02 17:32:46

...until今天我想火狐的WebExtension应该可以在Chrome中自动运行。

WebExtensions的创建考虑到了与Chrome扩展的向后兼容性。chrome.*命名空间可用于支持的API。这里的目标是轻松地将现有的扩展移植到FF,以快速引导生态系统。

但是,Mozilla忽略了与browser.*命名空间。Mozilla决定对API采用基于promise的方法,但仅适用于新的名称空间。

所以现在我的问题是,我的代码能在Chrome中运行吗?

或者,如果我添加一个var browser = chrome

在最上面的声明?

不是;它们的行为不同,并且具有不同的签名。Chrome将拒绝不需要显式回调的调用。browser.*变体将发出承诺。

或者Chrome根本不支持API上的Promise?

如果Chrome还不支持API函数上的Promise,它会在未来支持它们吗?

正如评论中提到的,基于承诺的API重写

是由Chrome考虑的,但还没有完成任何可见的工作。但是,存在多边形填充,包括你提到的那个..。除了自己包装方法来创建自己的polyfill之外,没有其他解决方案。

除此之外,我没有Chrome和Chromium,出于隐私和安全的原因,我不能安装它们。

那么您无论如何都不能正确地测试您的端口;对于您的潜在用户来说,这不是一个好的方法。你会更好

注释

在这种情况下进行移植。

票数 8
EN

Stack Overflow用户

发布于 2017-11-09 11:56:50

我还没看过 browser API,所以我可能有点离谱,但是如果

仅限不同之处在于Firefox API返回promises而不是使用回调,

chrome-promise库也许能帮上忙。它将所有需要回调的API调用包装在返回promises的函数中。

然后你可以在Chrome中做类似这样的事情:

代码语言:javascript
复制
var browser = new ChromePromise();

然后打电话给promise:

代码语言:javascript
复制
browser.storage.local.get(null).then(data => console.log(data));

如果您定义browser变量作为全局变量,并在任何其他脚本之前包含该脚本,您只需将其用作全局变量,而不必在要使用它的每个文件中都包含polyfill。

编辑:

的作者chrome-promise不再维护它,除了修复bug。他们列出了一些可供选择的库这里,包括Mozilla webextension-polyfill被行动组拒绝了。该库的自述文件解释了如何将其作为全局变量使用在各种扩展上下文中需要它的地方。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42191030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档