cqwcns 发表于 2019-10-3 07:56

Js 如何实现for循环中POST。

由于需要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啊,我把代码写给你

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('全部完成')
})()

珍爱0永远 发表于 2019-10-3 11:58

Promise正解

annybaby 发表于 2019-10-3 12:24

定时器是最简单的
页: [1] 2
查看完整版本: Js 如何实现for循环中POST。