2012-02-28 47 views
0

是否可以包裝類似setTimeout的函數,然後觸發回調函數。就像jQuery $(selector).on('action', callback)一樣。實現回調函數的自定義解決方案

var obj = { 
    mth1: function (callback) { 
     //----need to wrap to something 
      setTimeout(function() { console.log("1"); }, 1000); 
      console.log('2'); 
     //---- 
     // callback; 
    } 
}; 
function callback() { 
    console.log('3'); 
}; 
(function() { obj.mth1(callback); })(); 

我需要什麼:

2 
1 
3 
+0

是否有任何理由,你不能簡單地運行'回調()後''的console.log(1)'的'setTimeout'功能? – 2012-02-28 14:24:38

+0

這是具體的情況,下面我寫了另一種情況,我可以重新發布:但想象一下,這將是另一個代碼,而不是setTimeout,它將返回pdf或錯誤消息(如果生成PDF失敗)。所以我需要等待響應會返回,如果響應正常 - 比調用下載對話框,否則如果響應返回500 - 在標籤中顯示錯誤消息。如果從ajax返回pdf,我無法知道如何調用下載對話框。 – WISEMAN 2012-02-29 12:14:00

回答

2

只需在你的函數結束時setTimout

// *snip* 
setTimeout(function() { 
    console.log("1"); 
    callback(); 
}, 1000); 
// *snip* 
+0

是的這個解決方案將工作。 – WISEMAN 2012-02-29 10:21:30

+0

但想象一下,這將是另一個代碼,而不是setTimeout,它將返回pdf或錯誤消息(如果生成pdf失敗)。所以我需要等待響應會返回,如果響應正常 - 比調用下載對話框,否則如果響應返回500 - 在標籤中顯示錯誤消息。我不知道如何打電話給下載對話框,如果pdf從ajax返回 – WISEMAN 2012-02-29 10:30:00

0

不知道你要問什麼裏面添加它。只要確保它是一個函數,並調用它:

mth1: function (callback) { 

    //----need to wrap to something 
    setTimeout(function() { 
     console.log("1"); 
     // be sure it is a function 
     if (callback&& getType.toString.call(callback) == '[object Function]';) { 
     // call it 
     callback(); 
     } 
    }, 1000); 

    console.log('2'); 

} 
+0

仍然有相同的結果:2; 3; 1 – WISEMAN 2012-02-29 10:19:47

+0

對不起,我沒有看到部分*「我需要:2,1,3」* 。您可以在setTimeout函數內調用回調函數。如我的答案所示,Juts確保檢查「回調」是可執行函數,因此如果將無效回調作爲參數傳遞,您的代碼不會中斷。 – 2012-02-29 10:24:56

相關問題