for循环里执行setTimeout无法实现延迟执行

//循环复制
$(".forExecute").click(function(){
    var tableSign = $("#tableSign").val();
    if(!(tableSign > 0)){
        layer.msg("请选择要复制的数据");
        return;
    }
    var forNum = $("#forNum").val();
    for(var i = 1; i <= forNum; i++){
        var data = {
            "tableSign":tableSign,
            "pageNo":i,
            "pageSize":$(".pageSize").val(),
            "startDate":$(".startDate").val()    
        };
        setTimeout(executeDataCopy(data),5000);
    }
})

function executeDataCopy(data){
    $.ajax({
        type: "get",
        url: "executeCopyData.do",
        data:data, 
        dataType: 'json',
        success: function(data){
            if(data != null && data.success != null){
                layer.alert(data.msg);
            } else {
                layer.alert("系统繁忙,请稍后再试");
            }
        }
    });
}
阅读 4.4k
6 个回答

这样就可以了

for(var i =1; i<10; i++){
        (function(a){
            var data = 123456;
            setTimeout(function(){
                console.log(data);
            }, **a*2000**);
        })(i);
}

setTimeout(executeDataCopy(data),5000);
这句executeDataCopy已经被立刻执行了,可以用下面的方式传参:
setTimeout(executeDataCopy,5000,data);

setTimeout(executeDataCopy(data),5000);
这么写就相当于直接执行executeDataCopy(data);
再套一层:
setTimeout(function(){
    executeDataCopy(data)
},5000);
就行了
setTimeout(executeDataCopy,5000,data);
setTimeout(function(){
    executeDataCopy(data)
},5000);

setTimeout第一个参数是 Function,而你传了一个executeDataCopy(data),这是一个方法的调用(而不是方法本身),实际上你传给setTimeout的是undefined,可以按上面几位大佬的方法改。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题