Возникли проблемы с базовым скриптом greasemonkey - GM.getValue / GM.setValue (я думаю) - PullRequest
3 голосов
/ 27 сентября 2019

Я пытаюсь написать базовый скрипт Greasemonkey, но у меня возникают некоторые проблемы.По сути, скрипт обновит страницу и посчитает количество изображений на странице.Если количество изображений увеличилось, это предупредит меня и сделает эту вкладку активной.Если количество изображений одинаково или меньше, оно продолжит обновление страницы через заданные интервалы.

Я думаю, что лучший способ действий, основанный на том, на что я смотрел, - это использовать GM.getValue / GM.setValue, чтобы сохранить количество изображений для сравнения с новым изображением.сосчитать.Я просто не могу заставить его работать, хотя - я думаю, что моя логика здорова, но это просто проблема синтаксиса, несмотря на попытки разных вариантов.Я никогда раньше не использовал Javascript!

// ==UserScript==
// @name        *Page Refresher
// @include     *
// ==/UserScript==
// @grant    GM.getValue
// @grant    GM.setValue

var refreshRate = 10000; //Refreshes every 10s
var newCount =document.images.length; //Counts images on page

if (GM.getValue('oldCount',-1) === -1){
  GM.setValue('oldCount',newCount);
  window.setTimeout(function(){window.location.reload() ;},refreshRate);
} else {
  if (newCount <= GM.getValue('oldCount')){
      GM.setValue('oldCount',newCount);
      window.setTimeout(function(){window.location.reload() ;},refreshRate);
} else {
     if (newCount > GM.getValue('oldCount')){
         GM.setValue('oldCount',newCount);
         alert('More images!');
      }
}

Это грубый код, с которым я работаю.Я просто не совсем уверен, где я иду не так - я уверен, что это довольно просто, но я определенно борюсь.Спасибо!

1 Ответ

1 голос
/ 27 сентября 2019

Эти функции (например, GM.getValue ) в GM4 являются асинхронными.Это означает, что возвращаемое ими значение не сразу доступно, как в синхронном API.

В асинхронном коде вам нужно дождаться ответа.

Примечание. Вы должны получить значение oldCount один раз и кэшировать его, а не получать снова и снова из сохраненного значения.В блоке метаданных также есть ошибка.

Вот пример, основанный на вашем коде (упрощенный код)

// ==UserScript==
// @name        Page Refresher
// @include     *
// @grant       GM.getValue
// @grant       GM.setValue
// ==/UserScript==

(async () => {

  const refreshRate = 10000;                      // Refreshes every 10s
  const newCount = document.images.length;        // Counts images on page
  const oldCount = await GM.getValue('oldCount', -1);

  await GM.setValue('oldCount', newCount);        // save new value, wait since refreshing before saving can cause issues

  if (newCount > oldCount){ 
    alert('More images!'); 
  } 
  else { 
    setTimeout(() => { location.reload(); }, refreshRate); 
  } 

})();
...