Chrome扩展同步调用-仅在窗口关闭后创建窗口
Chrome Extensions synchronous calls - create window only after window closed
我有这个代码:
function voteNewWindow(mailNum) {
chrome.windows.create({
url: 'http://www.google.com',
incognito: true
}, function (window) {
console.log('created ' + window.id);
chrome.tabs.query({
active: true,
windowId: window.id
}, function (tabs) {
var tab = tabs[0];
chrome.tabs.executeScript(tab.id, {
file: "jquery-2.1.1.min.js"
}, function () {
chrome.tabs.executeScript(tab.id, {
file: "content_script.js"
}, function () {
chrome.tabs.sendMessage(tab.id, {
email: JSON.parse(localStorage.mailList)[mailNum]
}, function (response) {
console.log(response);
chrome.windows.remove(window.id);
console.log('window ' + window.id + " removed");
});
});
});
});
});
}
function execute() {
for (var i = 0; i < JSON.parse(localStorage.mailList).length; i++) {
voteNewWindow(i);
}
}
问题是所有的窗口同时打开。我想要一扇窗户只有在前一扇关上的时候才能打开。我希望voteNewWindow((在执行另一个voteNewWindow[((]之前完成它所要做的一切
如有任何帮助,我们将不胜感激。感谢
JavaScript承诺救援!
function voteNewWindow(mailNum) {
return function(){
return new Promise( function (resolve, reject){
chrome.windows.create({
/* ... */
}, function (response) {
console.log(response);
chrome.windows.remove(response.id);
console.log('window ' + response.id + " removed");
resolve(); // Proceed to the next
});
/* ... */
}
}
}
function execute() {
var sequence = Promise.resolve();
for (var i = 0; i < JSON.parse(localStorage.mailList).length; i++) {
sequence = sequence.then(voteNewWindow(i));
}
}
请参阅本节以了解此处发生的情况。基本上,我们创建了一个由then
粘合在一起的Promises链,这确保了只有在上一个Promises完成后,下一个Promise才会开始执行。
如果您需要在execute()
之后执行任何其他操作,请将其放在序列的末尾:
function execute(callback) {
var sequence = Promise.resolve();
for (var i = 0; i < JSON.parse(localStorage.mailList).length; i++) {
sequence = sequence.then(voteNewWindow(i));
}
sequence.then(callback);
}
您可以使用chrome库,它将chromeapi封装在promise调用中。您的嵌套回调可以修改为类似的内容
var thenChrome = require('then-chrome');
function voteNewWindow(mailNum) {
return thenChrome.windows.create({url: 'http://www.google.com', incognito: true})
.then(function(window) {
return thenChrome.tabs.query({active: true, windowId: window.id})
})
.then(function(tabs) {
return tabs[0];
})
.then(function(tab) {
return thenChrome.tabs.executeScript(tab.id, {file: 'jquery.js'});
})
...
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 创建弹出窗口
- 创建一个方法,通过一个窗口进行迭代并获取Titanium中的所有控件
- 如何在Ol3弹出窗口中添加用javascript创建的按钮上的点击事件
- Chrome应用程序在全屏中创建新窗口-html元素不是全高的
- 为在新窗口中打开外部链接创建异常
- 单击或取消选中复选框时,如何创建弹出的自定义窗口
- 为自定义网站创建JavaScript搜索框,创建显示搜索结果的弹出窗口
- 有没有一种方法可以检测何时触发了溢出-y:auto,并因此创建一个弹出窗口
- 如何在同一浏览器屏幕中创建多个窗口
- 如何在不使用iframe或库的情况下创建剪切显示窗口区域
- 传单:如何在弹出窗口中创建链接选择器
- 创建一个类似Jquery动画的Flipboard弹出窗口
- 在浏览器窗口中创建动态灵活的分割标记
- 如何在网站上创建仅显示文本的简单弹出窗口
- 使用 javascript 创建的窗口在使用 window.close() 时不会在卸载之前触发
- 模式窗口创建
- 如何为 ajax 模式弹出窗口创建回退
- 如何从弹出窗口创建超链接
- 打开一个新窗口创建一个新会话