吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1989|回复: 10
收起左侧

[求助] Js 如何实现for循环中POST。

[复制链接]
cqwcns 发表于 2019-10-3 07:56
由于需要POST的数据太大,为了程序稳定,所有将数组拆分为1000条每组,循环POST到PHP。问题来了,每次循环理论上应该等PHP返回完成才再次发送。
我一开始想到ajax同步,$.ajaxSettings.async = false,结果报错,提示async = false已弃用、不建议使用。
查了一下jq官网描述“同步请求可能会暂时锁定浏览器,从而在请求处于活动状态时禁用任何操作。从jQuery 1.8开始,不建议在async: falsejqXHR($.Deferred)中使用;您必须使用成功/错误/完成回调选项,而不要使用jqXHR对象的相应方法jqXHR.done()。”
我用的是for循环,回调的说法不适应我的情况吧。

求大神指点。

for (var i = 0, len = vRow; i < len; i += 1000) {
var arrDaoRuDiZhi = JSON.stringify(vDaoRuDiZhi.slice(i, i + 1000)).replace(/\\r/g, "");

$.post(vPostPhpUrl, {
arrDaoRuDiZhi: arrDaoRuDiZhi
},
function (data, status) {
var arrFanHui = JSON.parse(data);
console.log("服务器端完成");
});
};

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

jrq000 发表于 2019-10-3 08:25
帮顶一下 这个我还真没理解透
少不更事 发表于 2019-10-3 09:21
本帖最后由 少不更事 于 2019-10-3 09:24 编辑

很久没看jq了,也不太了解现在jq是怎样的。感觉你的问题可以看一下js 的fetch和Promise.all

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/all


https://developer.mozilla.org/zh-CN/docs/Web/API/WindowOrWorkerGlobalScope/fetch
傍晚升起的太阳 发表于 2019-10-3 09:22
用递归应该就可以了吧,封装成一个函数,把1000条数据弄成一个数组,参数为i+1 接口传递数组的i  然后在接口成功返回的回调里再调用自身,当i>1000时,跳出
寒尘丶Coldust 发表于 2019-10-3 09:27
好像也没想到比较优雅的方式。。。
大概写几行代码 表示一下思路
改用while循环

var debounce = false; // 也就是设定一个标识,POST期间不重复发
var i = 1; // i就是第几组数据
while(true) {
    if (debounce) { 延时几秒 continue; }
    debounce = true;

    //这里写POST请求代码,等success时,把debounce置false,i+1
    //同时判断有没有超过最后一组数据了,超过就break
}
傍晚升起的太阳 发表于 2019-10-3 09:33
如果你不想递归,还可以写一个定时器来操作   定时器时间设定非常短  然后设定一个全局变量为状态码,默认为false  当接口成功返回时 改为true 定时器内就不停的去判断这个状态码,当状态码为true时,则i++并且调用发送请求并且把状态码改为false   方法很多,都可以实现
mikeee 发表于 2019-10-3 10:38
deasync?
https://github.com/abbr/deasync
badyun 发表于 2019-10-3 10:41
本帖最后由 badyun 于 2019-10-3 10:47 编辑

用Promise啊,我把代码写给你

[JavaScript] 纯文本查看 复制代码
const request = async (arr) => {
    return new Promise((resolve, reject) => {
        $.post(vPostPhpUrl, {
            arrDaoRuDiZhi: arr
        },
            (data, status) => {
                resolve(JSON.parse(data))
            });
    })
};

(async () => {
    for (var i = 0, len = vRow; i < len; i += 1000) {
        var arrDaoRuDiZhi = JSON.stringify(vDaoRuDiZhi.slice(i, i + 1000)).replace(/\\r/g, "");
        await request(arrDaoRuDiZhi)
    };
    console.log('全部完成')
})()

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
cqwcns + 1 + 1 热心回复!

查看全部评分

珍爱0永远 发表于 2019-10-3 11:58
Promise正解
annybaby 发表于 2019-10-3 12:24
定时器是最简单的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-27 00:47

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表