Javascript(typescript)Chrome扩展,函数回调作为承诺?

Javascript(typescript)Chrome扩展,函数回调作为承诺?,javascript,typescript,google-chrome-extension,chain,arrow-functions,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.remo

对于这样的代码

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'错误,所以'void'类型上不存在'

*这是javascript类型脚本,但在这里不重要(?)

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

说明您使用的功能

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)中提供扩展

未经测试


那么您上面的代码应该可以在任何Web扩展中工作

公认的答案是好的,但是有些库已经为您这样做了,例如。这还包括承诺的回调

安装它与鲍尔

bower install chrome-extension-async

chrome extension async.js
文件,并直接包含它:

<script type="text/javascript" src="chrome-extension-async.js"></script>
我强烈建议您使用(相当新的)
async
await
语法,如果需要,TypeScript可以将其传输到JS的旧版本。 然后您的代码变成:

async function whatever(anotherFolder, anotherFolder2) {
    const parentFolder = await chrome.bookmarks.create({title:'whatever2'});
    await chrome.bookmarks.move(anotherFolder, {parentId: parentFolder.id});
    await chrome.bookmarks.removeTree(anotherFolder2);
}

这与基于承诺的代码做的事情相同,但会将异常冒泡起来,使其更易于与逻辑流一起使用(
如果分支逻辑即使有承诺也会很混乱)。

。然后()=>{
应该是
。然后(()=>{
首先,但最糟糕的是……您正在使用Promise构造函数反模式,还试图多次调用同一个Promise上的
resolve
(不会失败,但不会按照您的想法执行),而且,根据我阅读的文档,
chrome.bookmarks.create
不返回承诺(与firefox web扩展版本不同)…所以,不,你不能做任何
这是javascript typescript
-你确定吗?这里看起来像普通的ol'javascript第一条评论:打字错误///第二条评论:你能在这方面做得更多吗?///第三条评论:所以没有办法避免嵌套结构?///第四条评论:它看起来像javascript,因为它是javascript,但是writeen在一个.ts文件中,并从编辑器接收ts错误。因此,错误忽略了chrome.functions没有返回承诺,因此我必须将它们包装成承诺。现在看起来非常清楚,万分感谢!@Gerard-奇怪的是,firefox(MDN)firefox Web Extensions中的
书签.
函数文档(据说设计为与Chrome兼容)不要接受回调,相反,它们会以本机方式返回一个承诺。这使得编写与Crhome和Firefox兼容的Web扩展变得更加重要painful@JaromandaX我认为原生的承诺是最好的选择,但是Chrome支持这个扩展API的时间更长了,所以必须向后兼容。我相信他们会添加新的扩展API很快支持,同时我写了一个库(开源,欢迎投稿)这预示着整个ChromeAPI:尼斯-不知道这个库-尽管我确实认为你关于使用async/await的建议是不合理的,因为async/await只是一个承诺,并且是基于观点,而不是在这样一个简单的情况下的任何实际好处:pI接受你的库“猴子补丁”现有的函数?@JaromandaX
async
/
wait
不仅仅是promise的语法糖,本质上它还为该生成器创建了一个
函数*
生成器和一个推送观察器,用于发回每个promise的结果。这不仅仅是观点——它导致了更干净、更可读的代码,并增加了支持对于像
try
-
catch
-
finally
这样的结构,例如-如果我的示例
async
函数抛出一个异常,它将冒泡到主线程(尽管我没有包括任何显式错误处理),而Promise-only等价物在没有显式
catch()的情况下将一事无成
最后。我不会与你进行神学辩论:p不过我明白你的观点——几年前我对承诺非常着迷,我喜欢使用承诺的“功能性”方面——同样,这是观点,因此,与此无关:p@JaromandaX很公平:)任何一种方式(
async
/
等待
)()
)是对回调的巨大改进。
<script type="text/javascript" src="chrome-extension-async.js"></script>
function whatever(anotherFolder, anotherFolder2) {
    return  chrome.bookmarks.create({title:'whatever2'}).
        then(parentFolder => 
            chrome.bookmarks.move(anotherFolder, {parentId: parentFolder.id})).
        then(() => 
            chrome.bookmarks.removeTree(anotherFolder2));
}
async function whatever(anotherFolder, anotherFolder2) {
    const parentFolder = await chrome.bookmarks.create({title:'whatever2'});
    await chrome.bookmarks.move(anotherFolder, {parentId: parentFolder.id});
    await chrome.bookmarks.removeTree(anotherFolder2);
}