琦玉
发表于 2022-8-15 22:38:50
wwwwwllllk 发表于 2022-8-15 21:04
先输出下xhr,然后再看下取得是哪个里面得数据
输出XHR都在函数执行之后
cxxjackie
发表于 2022-8-15 22:49:21
xhr.open(method, url, true);
第三个参数设置为true,然后在onload里接收返回值。还可以试试这个:https://bbs.tampermonkey.net.cn/thread-2793-1-1.html
琦玉
发表于 2022-8-16 08:52:22
cxxjackie 发表于 2022-8-15 22:49
xhr.open(method, url, true);
第三个参数设置为true,然后在onload里接收返回值。还可以试试这个:https:/ ...
请问大佬,第三个参数默认不就是true吗?
王一之
发表于 2022-8-16 09:41:29
要不看一下这块?
[油猴脚本开发指南]脚本ajax的跨域请求
https://bbs.tampermonkey.net.cn/thread-136-1-1.html
(出处: 油猴中文网)
看错以为是GM_XMLHttpRequest
cxxjackie
发表于 2022-8-16 11:56:01
琦玉 发表于 2022-8-16 08:52
请问大佬,第三个参数默认不就是true吗?
你还是把完整代码贴出来吧,这样描述根本摸不着头脑。
王一之
发表于 2022-8-16 16:19:58
提问推荐去 https://bbs.tampermonkey.net.cn/forum-77-1.html 板块
琦玉
发表于 2022-8-18 07:55:49
cxxjackie 发表于 2022-8-16 11:56
你还是把完整代码贴出来吧,这样描述根本摸不着头脑。
functionorderDeployInfo(order_num){
var xhr = new XMLHttpRequest();
xhr.open("GET", url, true);
xhr.onload = function (e) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
let xhrString = JSON.parse(xhr.response)
console.log(xhrString.flag); //true
return xhrString.flag
} else {
console.error(xhr.statusText);
return xhr.responseText
}
}
};
xhr.onerror = function (e) {
console.error(xhr.statusText);
};
xhr.send(null);
}
if (orderDeployInfo('XD220817139')) {
console.log('ok')
}
代码大概就是这样,这里确定xhr 100% 返回xhrString.flag ,但是不会打印OK,因为异步加上延时,如果open里改成false,就可以打印ok,但是这段代码放在油猴上却不能实现,是不是油猴不支持同步,怕阻塞程序?
cxxjackie
发表于 2022-8-18 22:19:05
琦玉 发表于 2022-8-18 07:55
代码大概就是这样,这里确定xhr 100% 返回xhrString.flag ,但是不会打印OK,因为异步加上延时,如果op ...
你这属于把异步当同步来写了,即使xhr改同步,orderDeployInfo这个函数还是没有返回值(你在onload里return的是onload的返回值),所以if的判断条件永远是undefined,当然永远不会输出ok。解决方法要么就彻底改同步,open改false,onload里的代码移到send之后,要么就用Promise封装成异步。同步xhr的做法非常不推荐,因为会阻塞主线程,表现就是浏览器看起来像卡死了一样。Promise封装可以参考论坛开发指南里那几篇Promise的文章,也可以用我前面发的那个ajax库,像这个例子的用法示例如下:
(async function() {
const res = await ajax(url, {responseType: 'json'});
if (res.flag) {
console.log('ok');
}
})();
琦玉
发表于 2022-8-19 16:02:47
cxxjackie 发表于 2022-8-18 22:19
你这属于把异步当同步来写了,即使xhr改同步,orderDeployInfo这个函数还是没有返回值(你在onload里retu ...
其实我就想要同步的效果,程序远比这复杂,首先查询库存是否够,然后修改备注,再审核,但是现实往往可能还没修改备注就审核掉了,或者同时审核2张单,服务器又会报错,所以我就想程序顺序执行,而不是异步。
脚本体验师001
发表于 2022-8-19 16:59:06
琦玉 发表于 2022-8-19 16:02
其实我就想要同步的效果,程序远比这复杂,首先查询库存是否够,然后修改备注,再审核,但是现实往往可能 ...
如果是在战争年代,你早已经被鬼子一枪干死了
说话吞吞吐吐,还往怀里口袋里掏,你到底在掏什么,难道是掏枪?下一秒肯定你就硬了,这和抗日神剧肯定不一样
你觉得很复杂的程序,在这帮大佬们看来就像吃完饭顺带又啃了小姨子一口那么简单
1:首先查询库存是否够,这需要联网吧?
2:然后修改备注,这是你主动修改备注吧?要不要联网?
3:再审核,审核是服务器审核吧?
4:但是现实往往可能还没修改备注就审核掉了???
只要是联网它都是一条一条发送,也是一条一条接收,哪有同时的道理,你是自己都搞糊涂了
我觉得这事得从头捋一遍