none
使用setTimeout 定時 jQuery ajax 呼叫 action 在約600秒後卻沒有再動作 RRS feed

  • 問題

  • 各位先進
    在ASP.NET MVC 5 前台播放影片時
    使用setTimeout 每10秒透過jQuery ajax 呼叫 action 增加使用者的瀏覽時間
    目前發生都只記錄到10分鐘就停止了
    是否是因為瀏覽器進入睡眠狀態(sleep)的原因呢?
    若是此原因,請問有辦法可以防止或解決瀏覽器進入睡眠狀態讓setTimeout繼續執行嗎?

    2017年1月8日 上午 07:21

解答

所有回覆

  • 瀏覽器沒睡眠吧~

    應該是 Session Timeout

    你在 AJAX 對 Server 要求資料時,要把 Session Cookies 同時也送出,才不會造成 Server 端的 Session Timeout


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2017年1月8日 下午 02:55
  • 瀏覽器沒睡眠吧~

    應該是 Session Timeout

    你在 AJAX 對 Server 要求資料時,要把 Session Cookies 同時也送出,才不會造成 Server 端的 Session Timeout


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    在下把部分code貼出來以便釐清問題

    _PlayVideo.cshtml
    <script>
    ....
    ........
    
    var d1 = new Date();        //取當下日期時間作為計數器
    d1.setHours(0, 0, 0);   //計數器歸0 設定時間為 0:0:0
    var t = 0;
    var number = 0;
    
    function RecordTime() {
            var h = d1.getHours();
            var m = d1.getMinutes();
            var s = d1.getSeconds();
            
            //秒數增加
            d1.setSeconds(d1.getSeconds() + 1);
            
            t = setTimeout(RecordTime, 1000);
            if (s == 10) {
                number++;
                d1.setHours(0, 0, 1); //調整時間差
                var video = document.getElementById("my-video");
                RecordLearning(10, video.currentTime);
                console.log("currentTime: " + video.currentTime + " || number: " + number + " || Timer: " + new Date());
            }
        }
    
    //紀錄學習時間
        function RecordLearning(time, currentTime) {
            var videoId = $("#videoId").val();
    
            $.ajax({
                url: "@Url.Action("_RecordLearning")",
                type: "GET",
                cache: false,
                data: {
                    videoId: videoId,
                    time: time,
                    currentTime: currentTime
                },
            })
        .done(function (partialViewResult) {
            console.log("db connectioned");
        });
        }
    
    .....
    .........
    </script>


    CourseControler.cs
    public class CourseController : Controller
        {
            CollegeModel db = new CollegeModel();
            // GET: Course
            ......
           ...............
           ..............................
    
             public PartialViewResult _RecordLearning(int videoId, int time, float currentTime)
            {
                try
                {
                    var memberIdString = Utility.GetLoginMemberId();
                    if (!string.IsNullOrEmpty(memberIdString))
                    {
                        var video = db.Videos.Where(x => x.Id == videoId).First();
                        LearningRecord record = null;
                        var memberId = int.Parse(memberIdString);
                        var records = from o in db.LearningRecords
                                      where o.VideoId == video.Id &&
                                        o.MemberId == memberId
                                      select o;
                        DateTime dtNow = DateTime.Now;
                        if (records.Count() > 0)
                        {
                            record = records.First();
                            record.LengthCount += time;
                            record.LengthString = Utility.GetCourseLengthString(record.LengthCount);
                            record.CurrentTime = currentTime;
                            record.UpdateOn = dtNow;
                        }
                        else
                        {
                            record = new LearningRecord();
                            record.MemberId = memberId;
                            record.CourseId = video.CourseId;
                            record.VideoId = videoId;
                            record.LengthCount = time;
                            record.LengthString = Utility.GetCourseLengthString(time);
                            record.CurrentTime = currentTime;
                            record.IsDelete = false;
                            record.CreateOn = dtNow;
                            db.LearningRecords.Add(record);
                        }
                        //會員學習時間總計更新
                        var member = db.Members.Where(x => x.Id == memberId).First();
                        int totalLearningCount = 0;
                        if (member.TotalLearningCount == null) member.TotalLearningCount = 0;
    
                        member.TotalLearningCount += time;
                        totalLearningCount = int.Parse(member.TotalLearningCount.ToString());
                        member.TotalLearningString = Utility.GetCourseLengthString(totalLearningCount);
    
                        db.SaveChanges();
                    }
                }
                catch (Exception ex) { }
    
                return PartialView();
            }
    }

    現在發生都只執行到接近10分鐘時 (10秒1次 約 60次 就停止了)~
    無論在尖峰時段同時上線觀看影片20~30人或離峰時段 2~3人
    都是接近10分鐘(600秒)就沒有再紀錄....



    2017年1月9日 上午 02:55
  • 你的 ajax 加個

            async: true,

    看看是否改善。


    理直氣和,切記。

    個人

    • 已標示為解答 冷井情深 2017年1月11日 上午 11:55
    2017年1月9日 上午 04:02
  • 您的setTimeout 是那個 1000 嗎?  

    1秒跑一次?

    可以看一下 console 是否有 exception 


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2017年1月9日 上午 07:17
  • 與jQuery AJAX非同步參數沒關係....
    其實是其他因疏忽引發的問題...
    不過問題討論串要結掉
    還是標示一個回覆為解答....
    謝謝各位大大答覆與協助..
    2017年1月11日 上午 11:59
  • 您好,

    如果是其他的問題造成的,

    是否可以分享一下呢? 

    而在那個分享的內容勾選解簽。

    這樣更能讓幫助到有類似問題的人哦!

    感謝您

    2017年1月12日 上午 02:13