2012-12-22 38 views
10
function tryToDownload(url) 
{ 

     oIFrm = document.getElementById('myIFrm'); 
     oIFrm.src = url; 
     // alert(url); 
     // url=escape(url); 

     setTimeout(deletefile(url), 25000); 
} 

Sau đây là deletfile chức năngtại sao việc định giờ không trì hoãn việc thực thi chức năng?

function deletefile(url){ 

$.ajax({ 
    type:'post', 
    url: "<%= addToDoDeleteDownloadFile %>", 
    data:{filename:url}, 
    type : "GET", 
    timeout : 20000, 
    dataType : "text", 
    success : function(data) { 
     alert("success"); 

    } 
    }); 
} 

trên là jQuery tôi và im gọi một chức năng ở cuối sau 25 giây, nhưng một số cách nó không trì hoãn việc DeleteFile function (url) và thực hiện chỉ after.So những gì nên là vấn đề?

+0

thể trùng lặp của [Javascript setTimeout] (http://stackoverflow.com/questions/4128938/javascript-settimeout) – Fraser

+1

@Fraser: Đó không phải là thực sự một IMHO trùng lặp. – Matt

Trả lời

19

Trong dòng này, bạn đang gọi chức năng của mình và vượt qua kết quả đến setTimeout().

setTimeout(deletefile(url), 25000); 

Nếu bạn muốn trì hoãn việc thực hiện, thêm một chức năng wrapper:

setTimeout(function(){ deletefile(url); }, 25000); 

EDIT

Một thay thế được đề xuất bởi @Petah:

setTimeout(deletefile, 25000, url); 

Tất cả các thông số được chuyển đến setTimeout() sau khi trì hoãn, sẽ được chuyển đến hàm lúc thực thi. Vì vậy, trong trường hợp này, bạn chuyển số tham chiếu đến hàm, độ trễ và sau đó là tham số cho hàm theo thứ tự đó!

Lưu ý rằng theo cách MDN, cách truyền thông số này sẽ không hoạt động trong IE trước IE9.

+0

@Bhavik Kama: Nếu bạn có 'foo (deletefile (url))', điều đó sẽ gọi 'deletefile' ngay lập tức và chuyển giá trị trả về của nó vào' foo', đúng không? Vì vậy, nó chính xác giống với 'setTimeout', như Sirko nói. –

+2

Hoặc .... 'setTimeout (deletefile, 25000, url)' – Petah

+0

@Petah, chuyển các tham số bổ sung cho hàm này không hoạt động trong Internet Explorer –

3

Đó là vì bạn đang gọi hàm và sử dụng giá trị trả về trong lệnh gọi setTimeout. Bọc nó trong một chức năng ẩn danh để nó được gọi bởi setTimeout:

function tryToDownload(url) { 

    oIFrm = document.getElementById('myIFrm'); 
    oIFrm.src = url; 
    // alert(url); 
    // url=escape(url); 

    setTimeout(function() { deletefile(url); }, 25000); 

} 
+0

thnx man ... đã hoạt động –

Các vấn đề liên quan