Javascript( typescript )Chrome 扩展,函数回调如 promise ?

标签 javascript typescript google-chrome-extension chain arrow-functions

像这样的代码

let anotherFolder='whatever';
let anotherFolder2='whatever';

chrome.bookmarks.create( {title:'whatever2'}, function( parentFolder ) {
  chrome.bookmarks.move( anotherFolder, {parentId: parentFolder.id}, function() {
    chrome.bookmarks.removeTree( anotherFolder2, function() {
      resolve();
    });
  });
});

我可以将它转换为链式函数吗?有点像

let anotherFolder='whatever';
let anotherFolder2='whatever';

return new Promise(function(resolve){
  chrome.bookmarks.create( {title:'whatever2'}, function( parentFolder ) {
    resolve(parentFolder);
  }).then( (parentFolder) => {
    chrome.bookmarks.move( anotherFolder, {parentId: parentFolder.id}, function() {
      resolve();
    })
  }).then () => {
    chrome.bookmarks.removeTree( anotherFolder2, function() {
      resolve();
    });
  });
});

因为我收到错误“Property 'then' does not exist on type 'void'.'”

*这是 javascript-typescript,但在这里应该无关紧要 (?)

最佳答案

您需要“ promise ”任何 chrome.bookmarks.* 函数 - 顺便说一句,这使它们与 browser.bookmarks.* 函数一样工作Firefox 和(最终)Edge Web 扩展

promise 您使用的功能

let create = p1 => new Promise((resolve, reject) => {
    chrome.bookmarks.create(p1, resolve);
});
let move = (p1, p2) =>  new Promise((resolve, reject) => {
    chrome.bookmarks.move(p1, p2, resolve);
});
let removeTree = p1 => new Promise((resolve, reject) => {
    chrome.bookmarks.removeTree(p1, resolve);
});

然后您可以按如下方式使用这些函数:

let anotherFolder='whatever';
let anotherFolder2='whatever';


create({title:'whatever2'})
.then(parentFolder => move(anotherFolder, {parentId: parentFolder.id}))
.then(() => removeTree(anotherFolder));

如果您正在考虑在 Firefox(以及最终的 Edge)中使用您的扩展

未测试

let create = browser.bookmarks.create || p1 => new Promise((resolve, reject) => {
    chrome.bookmarks.create(p1, resolve);
});
let move = browser.bookmarks.move || (p1, p2) => new Promise((resolve, reject) => {
    chrome.bookmarks.move(p1, p2, resolve);
});
let removeTree = browser.bookmarks.removeTree || p1 => new Promise((resolve, reject) => {
    chrome.bookmarks.removeTree(p1, resolve);
});

那么你上面的代码应该在任何网络扩展中工作

关于Javascript( typescript )Chrome 扩展,函数回调如 promise ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43223641/

相关文章:

javascript - localStorage 按值排序

javascript - 在 native 的固定时间段内重新加载 setInterval 中的 api 数据

javascript - 如何使用正则表达式来分割字符串,其开头字符与此 <= | 中的任何一个匹配>= | = | !=

android - 安卓浏览器的扩展

google-chrome - Chrome 扩展弹出窗口总是在顶部

javascript - 在 Node.js 模块中立即调用

reactjs - 使用 typescript 在 create-react-app 中加载 sass

javascript - 如何重写函数中的接口(interface)并保持正确的返回类型?

typescript - 扩展全局公开的第三方模块

javascript - 解析 json 并在弹出窗口中显示图像