当前位置: 首页 > 知识库问答 >
问题:

如何在Chrome扩展中使用promise?

岑畅
2023-03-14

我正在尝试做的是创建一个chrome扩展,创建新的,嵌套的,书签文件夹,使用承诺。

执行此操作的函数是chrome.bookmarks.create()。但是我不能只循环这个函数,因为chrome.bookmarks.create是异步的。我需要等待,直到文件夹创建,并获得它的新ID,然后继续它的子级。

承诺似乎是要走的路。不幸的是,我找不到一个使用异步调用和自己的回调(如chrome.bookmarks.create)的最小工作示例。

我已经读了一些教程1,2,3,4。我已经搜索了stackOverflow,但所有的问题似乎都不是关于chrome扩展库的普通承诺。

我不想使用插件或库:不使用node.js、jquery、Q或其他任何插件。

我试着按照教程中的例子去做,但是很多事情没有意义。例如,教程说明:

promise构造函数接受一个参数--包含两个参数的回调:resolve和reject。

但接下来我看到了这样的例子:

常量wait=ms=>new Promise(resolve=>setTimeout(resolve,ms));

这是如何运作的对我来说是个谜。

另外,如果从来没有定义过resolve(),如何调用它?教程中没有一个示例似乎与实际生活中的代码相匹配。另一个例子是:

function isUserTooYoung(id) {
   return openDatabase() // returns a promise   
.then(function(col) {return find(col, {'id': id});})

我如何通过col,或得到任何结果!

因此,如果有人能给我一个关于承诺的最小工作示例,它包含一个异步函数和它自己的回调,这将是非常感谢的。

所以需要代码,所以这里是我的非工作尝试:

//loop through all
function createBookmarks(nodes, parentid){  

  var jlen = nodes.length;
  var i;
  var node;
  for(var i = 0; i < nodes.length; i++){
        var node = nodes[i];

        createBookmark(node, parentid);
  }
}

//singular create
function createBookmark(node, parentid){  
      var bookmark = { 
    parentId : parentid,
    index : node['index'],
    title : node['title'],
    url : node['url']
  }

  var callback = function(result){
    console.log("creation callback happened.");
    return result.id;  //pass ID to the callback, too
  }

    var promise = new Promise(function(resolve, reject) {

        var newid = chrome.bookmarks.create(bookmark, callback)

      if (newid){
        console.log("Creating children with new id: " + newid);
        resolve( createBookmarks(bookmark.children, newid));
      }

    });
}

//allnodes already exists
createBookmarks(allnodes[0],"0");

就是不管用。回调的结果总是未定义的,这是应该的,而且我看不出promise对象是如何改变任何东西的。当我尝试使用promissione.then()时,我同样感到迷惑不解。

var newid = promise.then(  //wait for a response?
            function(result){
            return chrome.bookmarks.create(bookmark, callback); 
            }
        ).catch(function(error){
            console.log("error " + error);
        });  

        if (node.children) createBookmarks(node.children, newid);

同样,newid总是未定义的,因为当然bookmarks.create()是异步的。

谢谢你能提供的任何帮助。

共有2个答案

叶衡虑
2023-03-14

利用回调函数总是最后一个参数的惯例,我使用一个简单的helper函数来保证chrome API:

function toPromise(api) {
  return (...args) => {
    return new Promise((resolve) => {
      api(...args, resolve);
    });
  };
}

并按如下方式使用:

toPromise(chrome.bookmarks.create)(bookmark).then(...);

在我的用例中,它只是在大多数时候工作。

孟宏才
2023-03-14

老实说,您应该只使用web扩展PolyFill。手工承诺chrome API是一种浪费时间和容易出错的做法。

如果您绝对坚持,这是一个如何承诺chrome.bookmarks.create的示例。对于其他chrome.*API,您还必须拒绝回调的错误参数。

null

function createBookmark(bookmark) {
  return new Promise(function(resolve, reject) {
    try {
      chrome.bookmarks.create(bookmark, function (result) {
        if (chrome.runtime.lastError) reject(chrome.runtime.lastError)
        else resolve(result)
      })
    } catch (error) {
      reject(error)
    }
  })
}


createBookmark({})
  .then(function (result) {
     console.log(result)
   }).catch(function (error) {
     console.log(error)
   })
 类似资料:
  • Puppeteer 可以用来测试 Chrome 扩展 注意 Chrome / Chromium 扩展当前只能在非无头模式下使用。 下面的代码用来处理扩展的 background page,该扩展的代码在 ./my-extension: const puppeteer = require('puppeteer'); (async () => { const pathToExtension =

  • 这篇官方教程似乎过时了,因为根据这篇文章,ga.js被弃用了。 此外,在教程中,它有: 而在我有 在Chrome扩展中使用谷歌分析的最新正确方法是什么

  • 问题内容: 我正在尝试在启动seleniumchrome时禁用所有chrome扩展名。但是,每次我运行代码时,所有扩展都将继续启动。有没有一种禁用扩展的方法。 样例代码 问题答案: 找到了解决方法。

  • null [1558606783.990][信息]:启动Chrome:“C:\程序文件(x86)\google\chrome\application\chrome.exe”--禁用-背景-网络--禁用-客户端--网络钓鱼--检测--禁用-默认-应用程序--禁用-扩展--禁用-扩展--禁用-扩展--例外=“C:\user\user\appdata\local\temp\scoped_dir19964

  • 问题内容: 我正在尝试在扩展弹出窗口中使用Google开发人员AngularJS库,但出现错误。 错误:在k(chrome-extension:// jambnlbfljcfpomlclcgphfmkjfiphkb / lib / lib)的功能(未知源)处,Jb(chrome- extension://jambnlbfljcfpomlclcgphfmkjfiphkb/lib/angular.js

  • 问题内容: 后来的AngularJS(1.3 beta 19)使用。铬萃取中禁止这样做。 如何在 不允许评估的情况下 解决问题? 错误信息: 拒绝将字符串评估为JavaScript,因为在以下内容安全策略指令:“ script-src’self’chrome-extension- resource:”中不允许使用’unsafe-eval’作为脚本源。 堆栈跟踪: 更新:请参阅https://doc