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"
                });
            }
        }
    });