У меня есть расширение для хрома. В его коде есть метод 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
}
В том же контексте окна я выполнил следующие команды на консоли. Результат можно увидеть следующим образом:
Я пишу те же команды здесь:
getSelectionFromPage() //-> true
window.selected //-> false
(getSelectionFromPage() && window.selected) //-> true
(getSelectionFromPage() && window.selected)
должно быть false
. Я пытался проверить typeof(window.selected)
и typeof(getSelectionFromPage())
, и оба возвращаются boolean
. Я не понимаю, почему это происходит.
true && false
должно быть false
не true
. но операция && показывает истину. Это тоже моя забота..
Вы устанавливаете окна. Selected=true;, вы можете сначала проверить window.selected ... Java-скрипт не является многопоточным или что-то в этом роде, когда он запускает блок кода, он делает это до конца, и другой код, который может сбросить это состояние, выиграл. не вмешивайся
Тело анонимной функции можно было бы записать гораздо более лаконично в виде стрелочной функции: selection => window.selected == selection[0] != ''
, хотя в этом случае вам может понадобиться !==
. ;-)
Функция, для которой установлено значение 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);
Функция обратного вызова еще не выполнена.
Спасибо за объяснение. Я понял, что напортачил с асинхронным вызовом.
True false являются частью логического типа данных, я не вижу в этом ничего плохого... Также вы использовали оператор and (&&), который
true && false -> false
, вы не ошибаетесь, или оператор (||)?true || false -> true