我正在尝试做的是创建一个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()是异步的。
谢谢你能提供的任何帮助。
利用回调函数总是最后一个参数的惯例,我使用一个简单的helper函数来保证chrome API:
function toPromise(api) {
return (...args) => {
return new Promise((resolve) => {
api(...args, resolve);
});
};
}
并按如下方式使用:
toPromise(chrome.bookmarks.create)(bookmark).then(...);
在我的用例中,它只是在大多数时候工作。
老实说,您应该只使用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