GM.getValue 未定义

问题描述 投票:0回答:2

我编写了一个小用户脚本,它最初仅适用于一个网页,现在我添加了更多功能,我尝试让脚本在多个站点上工作,据我所知,我必须从

localStorage
GM.getValue
,但不会让它发挥作用。 我已经知道这些函数是异步的,我必须使用它。因此,为了更好地了解这个功能,我编写了一个小测试脚本,但仍然没有成功 - 所以也许有人可以帮助我。

我让 GM.setValue 正常工作,所以如果我签入 Tampermokey 脚本标签,我会看到存储中有该脚本:

{
    "WFP_token": "123456789"
}

用户脚本是

// @grant           GM.getValue
// @grant           GM.setValue
// @grant           GM_getValue
// @grant           GM_setValue
// ==/UserScript==

(function() {
    'use strict';
    /**
    * Overall script parts are placed here
    */
    console.log('[WFP]: init');

    function getToken() {
        (async () => {
            let token = GM.getValue("WFP_token",-1);
            if (token != -1 && token != undefined) {
                return token;
            } else {
                window.setTimeout(getToken(),10)
            }
        })();
    }
    const WEBHOOK_TOKEN = getToken();
    console.log('[WFP]: '+WEBHOOK_TOKEN);

控制台输出为:

[WFP]: init
[WFP]: undefined

有人可以帮助我并指出我错在哪里以及我应该使用谁吗

GM.getValue

javascript greasemonkey tampermonkey userscripts
2个回答
0
投票

GM.getValue
getToken()
附近使用 wait 并在
setTimeout
else 情况下返回承诺

(async function() {
  'use strict';
  /**
   * Overall script parts are placed here
   */
  console.log('[WFP]: init');

  async function getToken(a) {
    let token = await GM.getValue("WFP_token", -1);
    if (token != -1 && token != undefined) {
      return token;
    } else {
      return new Promise((resolve) => {
        window.setTimeout(() => resolve(getToken()), 10);
      })
    }
  }

  const WEBHOOK_TOKEN = await getToken();
  console.log('[WFP]: ' + WEBHOOK_TOKEN);
})();


0
投票

虽然 Nagesh 的答案是正确的,但还缺少一件事:

确保元数据块中有

@grant GM.getValue

完成此操作后,请确保您的函数是异步的。

OP没有忘记这一步,但我却忘记了,最后在开发者博客上找到了解决方案。希望这对任何提出这个问题的人都有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.