连续n个ajax请求,怎样间隔1秒钟进行请求?

wlm212
  • 56
var feima = {
    ,json: function(url, data, success, options){
            return $.ajax({//code...})        
            }
}
    feima.getnumber = function(options,num){
       
        if(num >0 && num <=10){
            feima.json(buyNumberUrl,options,function (res){
                if(num > 1){
                    num--;
                    feima.getnumber(options,num);
                }else{
                    layer.msg('购买成功');
                }
            });
        }
    };
    feima.getnumber(data,8);

feima.getnumber(data,8); 调用后会连续发送8个ajax请求,怎样能把每个请求间隔1下下,我怕服务器受不了。我用setTimeout("feima.getnumber(options,num);",1000) 套住一下,貌似是不行。这个函数参数比较奇葩。

要么接受,纯字符串。要么必须是函数名称。

我按照字符串传,还是各种奇怪的错误提示。函数未定义了。什么什么的。

回复
阅读 665
1 个回答
✓ 已被采纳

用 await 处理起来比较方便,需要把 getnumber 声明为 async 函数。

先定义一个 delay() 函数用来延时,然后就可以把递归调用变成循环,写起来比较简单

function delay(ms) {
    return new Promise(resolve => {
        setTimeout(resolve, ms);
    });
}

feima.getnumber = async function (options, num) {
    if (num > 10) { return; }
    for (; num > 0; num--) {
        await feima.json();
        await delay(1000);
    }
};

如果继续使用你的递归写法,建议把退出/结束逻辑前置,后面单独处理递归调用。递归的时候记得加 setTimeout 延时。

feima.getnumber = function (options, num) {
    if (num > 10) { return; }
    if (num <= 0) {
        layer.msg('购买成功');
    }

    feima.json(buyNumberUrl, options, function (res) {
        setTimeout(() => feima.getnumber(options, num - 1), 1000);
    });
};
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏