搜尋

首頁  >  問答  >  主體

javascript - js有沒有可以偵測一個同步方法執行時間的?

具體是這樣,有沒有一個可以偵測同步方法執行時間的,就是如果這個執行時間過長,我就主動去kill掉這個方法

迷茫迷茫2752 天前907

全部回覆(5)我來回復

  • typecho

    typecho2017-06-15 09:25:26

    這就要看你的同步方法是什麼了?

    • 如果是第三方函式庫提供的方法,那要看它本身有沒有提供停止方法,若沒有你也沒有辦法;

    • 如果是涉及到檔案 i/o/delete/create 你可能就阻止不了,但你可以在它報錯後寫個逆函數執行來恢復原狀;

    • 如果這個方法是你自己寫的,並且有多個子函數,那麼你可以在函數內部定義一個計時器,執行每個子函數前檢查時間是否超過允許,這是一個變通的方法;

    • 如果這個方法是你自己寫的,而且只有一步,既然是個耗時方法,那估計有循環存在吧,那每次循環檢查時間是可以的吧。 。 。

    回覆
    0
  • 世界只因有你

    世界只因有你2017-06-15 09:25:26

    從JS 的角度看,執行同步方法時,整個應用會阻塞在其中,這時即便是setTimeout 異步觸發的回調,也要在同步方法執行完成後的Event Loop 中才能執行,因此不能夠在同步方法中檢查自身的執行時間並Kill 自身。

    從電腦科學的角度看,題主的問題其實就是經典的停機問題:

    停機問題(英文:halting problem)是邏輯數學中可計算性理論的一個問題。通俗地說,停機問題就是判斷任意一個程式是否能在有限的時間內結束運作的問題。此問題等價於如下的判定問題:是否存在一個程式P,對於任意輸入的程式w,能夠判斷w會在有限時間內結束或死循環。

    這個問題是 NP 困難的,這也意味著不存在時間複雜度上可接受的演算法來直接解決。

    但跳出學院派的演算法來看,工程中的變通方式很多,如採用 Web Worker 或 PM2 的進程管理機制等,這裡不再展開了。

    回覆
    0
  • 怪我咯

    怪我咯2017-06-15 09:25:26

    那你只能搞多線程了……
    http://www.w3school.com.cn/ht...
    然而、js如何kill掉另一個方法也是個迷……
    說到底……你直接用非同步不就好了||||

    回覆
    0
  • 黄舟

    黄舟2017-06-15 09:25:26

    console.time("time1")
    $("*").each(function(){})
    
    console.timeEnd("time1") 

    經提醒,這樣確實不是辦法,另一個低端的辦法恐怕只能這樣了:

        var func = function(t1) {
            var sum = 0,
                t2;
            for (var i = 0; i <= 10000; i++) {
                sum += i;
                t2 = new Date().getTime() - t1;
                if (t2 > 1) {
                    throw '超时';
                }
            }
            console.log(sum);
        };
    
        try {
            func(new Date().getTime());
        } catch (e) {
            console.log(e);
        }

    不一定適合所有業務,而且打點本身會讓程序變得更慢。

    回覆
    0
  • 女神的闺蜜爱上我

    女神的闺蜜爱上我2017-06-15 09:25:26

    Webworker可以在另一個執行緒執行你的計算邏輯,onmessage方法可以接受執行的結果,terminate
    方法可以終止webworker的執行

    var job001DoneIndictor=false;
    var myWorker = new Worker('job001.js');
    //接收worker传递过来的数据
    myWorker.onmessage = function(event){
        
      job001DoneIndictor=true;
    };
    setTimeout(function(){
        if(!job001DoneIndictor){
           myWorker.terminate();
           myWorker =null;
        }
    },5000);//设置超时检测时间

    回覆
    0
  • 取消回覆