JavaScript 显示逻辑运算的错误结果

JavaScript showing wrong result for logical Operation

我有一个 chrome 分机。它的代码有一个方法 getSelectionFromPage() 可以捕获网页上选择的文本,并且总是 returns true 如下所示:

function getSelectionFromPage() {
  window.selected = true;
  chrome.tabs.executeScript({
  code: "window.getSelection().toString();"
 }, function(selection) {
  if (selection[0] != '') {
    window.selected = true;
  }else{
    window.selected = false;
  }
 });
 return true
}

在相同的 window 上下文中,我 运行 在控制台上执行以下命令。
可以看到结果如下:

我在这里也写同样的命令:

getSelectionFromPage() //-> true
window.selected //-> false
(getSelectionFromPage() && window.selected) //-> true

(getSelectionFromPage() && window.selected) 应该是 false。我试过检查 typeof(window.selected)typeof(getSelectionFromPage()),两者都返回 boolean。我不明白为什么会这样。

设置为false的函数是一个回调函数。在当前执行上下文完成之前,这不会执行。因此,在&& window.selection执行完成后才会设置为false。

executeScript 文档:https://developer.chrome.com/extensions/tabs#method-executeScript

事情的顺序是:

(function () {
  window.selected = true; // Runs
  chrome.tabs.executeScript({code: "window.getSelection().toString();"}, function(){
    window.selected = false;
  }); // Calls browser API and  set's callback (the anonymous function there) to call later)
  // NOTE: the callback function which was set here was NOT executed yet it was only defined.
  return true;
})() // true
&& window.selected // this is currently true
// Later, now callback executes

如果您想等待,可以改用 Promise

  function getSelectionFromPage() {
    return new Promise(function (resolve) {
      chrome.tabs.executeScript(
        {code: "window.getSelection().toString();"},
        // or just put resolve here instead of defining a function to get value directly
        function(v){
          resolve(!!v);
        }
      );
    });
  }

  getSelectionFromPage().then(haveSelection => console.log(haveSelection);