Javascript If/else循环执行这两个条件
好的,我有下面的代码。其思想是检查页面是否存在,如果不存在,则打开一个新选项卡。如果存在,请导航到它Javascript If/else循环执行这两个条件,javascript,if-statement,google-chrome-extension,Javascript,If Statement,Google Chrome Extension,好的,我有下面的代码。其思想是检查页面是否存在,如果不存在,则打开一个新选项卡。如果存在,请导航到它 chrome.browserAction.onClicked.addListener(function(tab) { function check() { chrome.tabs.query( {currentWindow: true, url: 'https://www.google.com/*'}, function(tab
chrome.browserAction.onClicked.addListener(function(tab) {
function check() {
chrome.tabs.query(
{currentWindow: true, url: 'https://www.google.com/*'},
function(tabs) {
tabs.forEach(function(tab) {
console.log('Tab ID, URL: ', tab.id, ' ', tab.url);
if(tab.url !== '')
{
var updateProperties = {"active": true};
chrome.tabs.update(tab.id, updateProperties, function(tab){ });
console.log('Assign true to functon');
return true;
}
});
});
};
if(check() === true) {
console.log('Function is true, do nothing')
}
else {
console.log('Function is false, open page')
chrome.tabs.create({ url: "https://www.google.com"});
}
});
第一部分工作正常,但第二部分同时执行true和false部分。这就像它在函数之前执行if/else语句一样?当您添加回调时,返回值不会直接返回到函数响应中-因此在您的情况下,
check()
不会返回任何内容。在check()
中使用的回调函数返回一个值,但该值实际上并不是由函数返回的,它实际上不会返回任何内容。至少有两种可能的解决方案:
1.将if/else
放在回调中,并独立运行函数一次:
2.使用
添加回调时,返回值不会直接返回到函数响应中-因此在您的情况下,
check()
不会返回任何内容。在check()
中使用的回调函数返回一个值,但该值实际上并不是由函数返回的,它实际上不会返回任何内容。至少有两种可能的解决方案:
1.将if/else
放在回调中,并独立运行函数一次:
2.使用
代码中有几个问题:
check
从不返回任何内容,因此check()===true
将永远不会为true。如果您在控制台中看到“函数为true,不执行任何操作”,则它不是来自该代码检查
无法返回任何有用的内容,因为它是异步的*check
,并将创建逻辑移到回调中:
chrome.browserAction.onClicked.addListener(function(tab) {
chrome.tabs.query({
currentWindow: true,
url: 'https://www.google.com/*'
}, function(tabs) {
const tab = tabs.find(tab => tab.url !== '');
if (tab) {
const updateProperties = {
"active": true
};
chrome.tabs.update(tab.id, updateProperties, function(tab) {});
} else {
chrome.tabs.create({
url: "https://www.google.com"
});
}
}
});
我有几个旁注,因为我很久没有写Chrome扩展了:
选项卡吗?假设您正在将url
传递到query
,如果(tabs.length)
告诉您该选项卡已经存在,那么会不会告诉您
chrome.tabs.update
*我假设是这样,因为它接受它调用的回调,而不是返回数组。令人恼火的是,文档中并没有这样说。卡里姆在评论中说,我相信他。:-) 代码中有几个问题:
check
从不返回任何内容,因此check()===true
将永远不会为true。如果您在控制台中看到“函数为true,不执行任何操作”,则它不是来自该代码检查
无法返回任何有用的内容,因为它是异步的*check
,并将创建逻辑移到回调中:
chrome.browserAction.onClicked.addListener(function(tab) {
chrome.tabs.query({
currentWindow: true,
url: 'https://www.google.com/*'
}, function(tabs) {
const tab = tabs.find(tab => tab.url !== '');
if (tab) {
const updateProperties = {
"active": true
};
chrome.tabs.update(tab.id, updateProperties, function(tab) {});
} else {
chrome.tabs.create({
url: "https://www.google.com"
});
}
}
});
我有几个旁注,因为我很久没有写Chrome扩展了:
选项卡吗?假设您正在将url
传递到query
,如果(tabs.length)
告诉您该选项卡已经存在,那么会不会告诉您
chrome.tabs.update
*我假设是这样,因为它接受它调用的回调,而不是返回数组。令人恼火的是,文档中并没有这样说。卡里姆在评论中说,我相信他。:-) 我原以为在
check()
函数中缺少return
语句会提示此处存在严重错误。唯一可能的方法是,您的侦听器绑定到两个不同的元素,并为同一事件分别调用它们。它肯定不会同时执行两个分支。事实上,使用该代码,它绝对不会执行if
分支,因为check
从不返回值,因此check()==true
将永远不会为true。如果您在控制台中看到“Function is true,do nothing”(函数为true,不执行任何操作),则它不是来自该代码。此外,请注意,基于它接受回调而不是返回数组的事实,它似乎是异步的(尽管令人恼火的是,它在文档中实际上没有这样说)。这意味着check
无法返回该选项卡是否存在的标志。您希望在查询
回调中创建逻辑。@卡里姆:谢谢您的确认,我将作为副本关闭。奇怪的是,文档没有明确地这么说。我本以为您的check()中缺少return
语句
函数可能会提示此处存在严重错误。唯一可能的方法是,将侦听器绑定到两个不同的元素,并为同一事件分别调用它们。它肯定不会同时执行两个分支。事实上,使用该代码,它绝对不会执行if
分支,因为check
从不返回值,因此check()==true
将永远不会为true。如果您在控制台中看到“Function is true,do nothing”(函数为true,不执行任何操作),则它不是来自该代码。此外,请注意,基于它接受回调而不是返回数组的事实,它似乎是异步的(尽管令人恼火的是,它在文档中实际上没有这样说)。这意味着check
无法返回该选项卡是否存在的标志。您希望在查询
回调中创建逻辑。@卡里姆:谢谢您的确认,我将作为副本关闭。奇怪的是,这些文件并没有这么明确地说。
chrome.browserAction.onClicked.addListener(function(tab) {
chrome.tabs.query({
currentWindow: true,
url: 'https://www.google.com/*'
}, function(tabs) {
const tab = tabs.find(tab => tab.url !== '');
if (tab) {
const updateProperties = {
"active": true
};
chrome.tabs.update(tab.id, updateProperties, function(tab) {});
} else {
chrome.tabs.create({
url: "https://www.google.com"
});
}
}
});