donsllon 发表于 2024-6-27 19:32

关于油猴脚本的一个问问题,代码的处理结果没按顺序执行呢?

if(zdm=="505")
      {
            zdnr=document.getElementById(indexnr).value.replace("▼a","");
            var arr505=zdnr.split(",")
            var other=arr505;
            var yuanwen=arr505;
            var translation;
            const url = 'https://findmyip.net/api/translate.php?text=' + encodeURIComponent(yuanwen);
                GM_xmlhttpRequest({
                  method: 'GET',
                  url: url,
                  onload: function(response) {
                        if (response.status == 200) {
                            var Jresponse = JSON.parse(response.responseText);
                            let translation = Jresponse.data.translate_result;
                            console.log(translation+"100");
                        }
                  },
                  onerror: function(error) {
                        console.error('翻译请求发生错误:', error);
                  }
                });
            console.log(translation+"100");
            if(other.substr(other.length-1,1)!=".")
            {
                if(other.substr(other.length-1,1)!=")"&&other.substr(other.length-1,1)!="-"&&other.substr(other.length-1,1)!='"')
                {
                  setInputValue(document.getElementById(indexnr), "▼a"+arr505+"("+translation+"),"+arr505+".")
                }
            }
            else
            {
                setInputValue(document.getElementById(indexnr), "▼a"+arr505+"("+translation+"),"+arr505)
            }
      }

为什么,291行是后出的结果

涛之雨 发表于 2024-6-27 19:57

本帖最后由 涛之雨 于 2024-6-27 19:59 编辑

`GM_xmlhttpRequest`是异步函数。
更多细节和解决方案,请自行研究。。。

此外,[`substr` 已被弃用](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/substr),
同上,更多细节和解决方案,请自行研究。。。

星峰 发表于 2024-6-27 20:00

异步,GM_xmlhttpRequest不会先执行里面的onload

最新的 发表于 2024-6-27 21:14

因为 JavaScript 中的 console.log 是异步执行的,而你的翻译请求是通过 GM_xmlhttpRequest 异步进行的

chr_233 发表于 2024-6-27 22:31



举个例子,像这样把GM_xmlhttpRequest包装成异步函数,然后用 await sendQmsg() 就可以顺序执行异步函数了

donsllon 发表于 2024-6-28 10:09

本帖最后由 donsllon 于 2024-6-28 10:11 编辑

chr_233 发表于 2024-6-27 22:31
举个例子,像这样把GM_xmlhttpRequest包装成异步函数,然后用 await sendQmsg() 就可以顺序执行异步函 ...
这个方法是可以了,可出现一个新的问题了
async function main1() {
                try {
                  this.fyjg = await translateText(yuanwen);
                  console.log(this.fyjg);
                } catch (error) {
                  console.error(error);
                }
                if(other.substr(-1,1)!=".")
                {
                  if(other.substr(-1,1)!=")"&&other.substr(-1,1)!="-"&&other.substr(-1,1)!='"')
                  {
                        console.log(this.fyjg+"100");
                      setInputValue(document.getElementById(indexnr), "▼a"+arr505+"("+this.fyjg+"),"+arr505+".")
                  }
                }
                else
                {
                  console.log(this.fyjg+"200");
                  setInputValue(document.getElementById(indexnr), "▼a"+arr505+"("+this.fyjg+"),"+arr505)
                }
            }
            main1();
      }

setInputValue(document.getElementById(indexnr), "▼a"+arr505+"("+this.fyjg+"),"+arr505+".")
可这个代码又不执行了。{:1_907:}

chr_233 发表于 2024-7-9 00:25

donsllon 发表于 2024-6-28 10:09
这个方法是可以了,可出现一个新的问题了
async function main1() {
          ...

要确保在Promise里面调用了resolve或者reject,不然await不会返回,会一直阻塞
页: [1]
查看完整版本: 关于油猴脚本的一个问问题,代码的处理结果没按顺序执行呢?