Google chrome 如何在Chrome扩展中使用承诺?

Google chrome 如何在Chrome扩展中使用承诺?,google-chrome,google-chrome-extension,promise,extension-methods,Google Chrome,Google Chrome Extension,Promise,Extension Methods,我想做的是创建一个chrome扩展,它可以使用创建新的嵌套书签文件夹 执行此操作的函数是chrome.bookmarks.create()。但是我不能 循环此函数,因为chrome.bookmarks.create是异步的。我需要等到文件夹被创建,并获得它的新ID,然后再继续它的子文件夹 承诺似乎是前进的方向。不幸的是,我找不到一个使用异步调用及其自身回调(如chrome.bookmarks.create)的最小工作示例 我读了一些教程。我已经搜索了stackOverflow,但所有的问题似乎都

我想做的是创建一个chrome扩展,它可以使用创建新的嵌套书签文件夹

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

承诺似乎是前进的方向。不幸的是,我找不到一个使用异步调用及其自身回调(如chrome.bookmarks.create)的最小工作示例

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

我不想使用插件或库:没有node.js、jquery或Q之类的东西

我试着按照教程中的示例进行操作,但很多事情都没有意义。例如,本教程说明:

承诺构造函数接受一个参数——一个包含两个参数的回调 参数:解析和拒绝

但我看到了这样的例子:

const wait=ms=>newpromise(resolve=>setTimeout(resolve,ms))

这是怎么回事对我来说是个谜

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

我如何通过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");
同样,newid总是未定义的,因为bookmarks.create()当然是异步的


感谢您提供的任何帮助。

老实说,您应该使用。手动发布ChromeAPI既浪费时间又容易出错

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

函数createBookmark(书签){
返回新承诺(功能(解决、拒绝){
试一试{
chrome.bookmarks.create(书签,函数(结果){
if(chrome.runtime.lastError)拒绝(chrome.runtime.lastError)
否则解决(结果)
})
}捕获(错误){
拒绝(错误)
}
})
}
createBookmark({})
.然后(函数(结果){
console.log(结果)
}).catch(函数(错误){
console.log(错误)

})
利用回调函数始终是最后一个参数的约定,我使用一个简单的帮助函数来提示chrome API:

函数toPromise(api){ 返回(…参数)=>{ 返回新承诺((解决)=>{ api(…参数,解析); }); }; } 然后像这样使用它:

toPromise(chrome.bookmarks.create)(bookmark)。然后(…);

在我的用例中,它大部分时间都是有效的。

接受回调的Chrome API方法没有任何返回值,正如您在文档中看到的那样。它们仅在回调中提供结果。顺便说一句,你可以简单地使用。
//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");
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);