JavaScript показывает неправильный результат для логической операции

У меня есть расширение для хрома. В его коде есть метод 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
}

В том же контексте окна я выполнил следующие команды на консоли. Результат можно увидеть следующим образом:

JavaScript показывает неправильный результат для логической операции

Я пишу те же команды здесь:

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

(getSelectionFromPage() && window.selected) должно быть false. Я пытался проверить typeof(window.selected) и typeof(getSelectionFromPage()), и оба возвращаются boolean. Я не понимаю, почему это происходит.

True false являются частью логического типа данных, я не вижу в этом ничего плохого... Также вы использовали оператор and (&&), который true && false -> false, вы не ошибаетесь, или оператор (||)? true || false -> true

Hassan Faghihi 24.06.2019 06:19
true && false должно быть false не true. но операция && показывает истину. Это тоже моя забота..
TechCreative 24.06.2019 06:21

Вы устанавливаете окна. Selected=true;, вы можете сначала проверить window.selected ... Java-скрипт не является многопоточным или что-то в этом роде, когда он запускает блок кода, он делает это до конца, и другой код, который может сбросить это состояние, выиграл. не вмешивайся

Hassan Faghihi 24.06.2019 06:24

Тело анонимной функции можно было бы записать гораздо более лаконично в виде стрелочной функции: selection => window.selected == selection[0] != '', хотя в этом случае вам может понадобиться !==. ;-)

RobG 24.06.2019 06:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Функция, для которой установлено значение false, является обратным вызовом. Это не будет выполняться до тех пор, пока текущий контекст выполнения не будет завершен. Поэтому для него не будет установлено значение false до тех пор, пока && window.selection не завершит выполнение.

Документы 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.info(haveSelection);

Функция обратного вызова еще не выполнена.

Goblinlord 24.06.2019 06:32

Спасибо за объяснение. Я понял, что напортачил с асинхронным вызовом.

TechCreative 24.06.2019 06:36

Другие вопросы по теме