Расширенное свойство объекта DOM (окна) javascript равно нулю при перезагрузке страницы после простоя - PullRequest
0 голосов
/ 10 мая 2019

У меня есть пользовательское расширенное свойство, присоединенное к объекту окна в JavaScript следующим образом:

Community.js

(function (window, document, $) {
    'use strict';
    var containerScrollPositionOnHideList = [];
    var scrollToTopOnShowContainerList = [];
    var userProfileInfo = {};

    window.Community = $.extend({
        //init
        init: function () {
            var Site = window.Site;
            Site.run();
            this.enableHideShowEventTrigger();
        },
    setUserInfo: function (userObj) {
            if (UtilModule.allowDebug) { debugger; }
            window.localStorage.setItem('userInfo', JSON.stringify(userObj));
            var d = new $.Deferred();
            $.when(this.initUserProfile(userObj.UserId)).done(function () {
                d.resolve("ok");
            });
        },
    getUserInfo: function () {
            var userJson = window.localStorage.getItem('userInfo');
            var userObj = JSON.parse(userJson);
            return userObj;
        },  
})(window, document, jQuery);   

Проблема заключается в том, что это свойство свойства window.Community равно нулю в определенных сценариях, когда я обновляю страницу, которую я собираюсь описать ниже, вместе с потоком кода.

и вот модуль в JavaScript для принудительной перезагрузки сценариев, даже если они кэшируются при каждом обновлении страницы, поскольку мой код сильно зависит от вызовов javascript, поэтому я просто включил его, чтобы убедиться, что пока я пишу перезагрузки кодовой страницы каждый раз код ниже выглядит следующим образом:

util.js

var UtilModule = (function () {
    var allowDebug = false;
    var currentVersion = 0;
    var properlyLoadScript = function (scriptPath, callBackAfterLoadScript) {
        //get the number of `<script>` elements that have the correct `src` attribute
        //debugger;
        var d = $.Deferred();
        $('script').each(function () {
            console.log($(this).attr('src'));
        });
        if (typeof window.Community == 'undefined') {
            //debugger;
            console.log('community was undefined till this point');
            //the flag was not found, so the code has not run
            $.when(forceReloadScript(scriptPath)).done(function () {
                callBackAfterLoadScript();
                d.resolve("ok");
            });
        }
        else {
            console.log('Community loaded already and running now : ' + scriptPath);
            callBackAfterLoadScript();
        }
        return d.promise();
    };
    var forceReloadScript = function (scriptPath) {
        if (UtilModule.allowDebug) { debugger; }
        var d = $.Deferred();
        initCurrentVersion();
        var JSLink = scriptPath + "?version=" + currentVersion;
        var JSElement = document.createElement('script');
        JSElement.src = JSLink;
        JSElement.onload = customCallBack;
        document.getElementsByTagName('head')[0].appendChild(JSElement);
        function customCallBack() {
            d.resolve("ok");
        }
        return d.promise();
    };
    var enableDebugger = function () {
        allowDebug = true;
    };
    var disableDebugger = function () {
        allowDebug = false;
    };
    var debugBreakPoint = function () {
        if (allowDebug) {
                    }
    };
    var initCurrentVersion = function () {
        if (currentVersion == 0) {
            var dt = new Date();
            var ttime = dt.getTime();
            currentVersion = ttime;
        }
    };
    var getCurrentVersion = function () {
        return currentVersion;
    };
    return {
        forceReloadScript,
        properlyLoadScript,
        enableDebugger,
        disableDebugger,
        debugBreakPoint,
        allowDebug,
        getCurrentVersion
    };

})();

Примечание. Я создал отложенные объекты для разрешения только после успешного вызова JSElement.onload. Этот шаг был сделан только для целей тестирования, чтобы убедиться, что я что-то не пропустил, прежде чем достигнет точки вызова метода, в котором я получаю ошибку.

После этого код, в который я загружаю скрипты с использованием UtilModule в моем файле макета, выглядит следующим образом:

_Layout.cshtml

<script src = "~/Scripts/Application/Modules/Util.js" ></script>
<script>

$.when(
    UtilModule.properlyLoadScript('/Scripts/Application/Community.js', () => {
    // Community.init() was supposed to be called here but i was still getting the error so i implemented this using promise that is returned from properlyLoadScript and call Community.init() further in .done callback to make sure that script is properly loading till this point.
    //window.Community.init();
    })
).done(function() {
    window.Community.init();
});
</script>
@RenderSection("scripts", required: false)

Теперь перейдем к моему основному файлу, где выполняется мой индексный файл, имеющий (_layout.chsmtl) в качестве родительского макета

есть

Index.cshtml

@{
    ViewBag.Title = "My Blog";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<article id="BlogPage" style="margin: 5px;">
</article>
@section scripts{


  <script type="text/javascript">
    $(document).ready(function () {
      $.when(UtilModule.properlyLoadScript('/Scripts/Application/Modules/Blog.js', () => {
      })).done(function () {
        BlogModule.init();
      });
    });

    //});
  </script>
}

Насколько я знаю, сценарии @section выполняются только после первой загрузки всех сценариев на странице макета, поэтому кажется безопасным местом для инициализации кода, который зависит от некоторого сценария в файле _Layout.HTML и дополнительно прилагается с $ (document) .ready () для тестирования, чтобы убедиться, что этот скрипт загружается после того, как все остальное уже загружено.

Примечание. Я запускаю весь этот код в режиме in-cognito в chrome, поэтому при выполнении этого кода ничего не кэшируется

теперь мой файл Blog.js выглядит так, как показано ниже

var BlogModule = (function () {
    var moduleReference = this;
    var PageId = "#BlogPage ";
    var currentUser;
    var BlogPostList = [];
    var blogPostInfo = {};

    //init
    var init = function () {
        if (UtilModule.allowDebug) { debugger; }
        //This is where the problem happens
        console.log(window.Community);
        console.log(window.Community.getUserInfo());
        currentUser = window.Community.getUserInfo();
        initBlogInformation();
        //window.Community.registerModule(BlogModule);
        if (Object.keys(window.Community.getUserProfileObject()) <= 0) {
            $.when(window.Community.initUserProfile(currentUser.UserId)).then(function () {
                $.when(initBlogInformation()).done(function () {
                    //debugger;
                    console.log(BlogPostList);
                    window.WidgetManager.populateWidget(PageId, moduleReference);
                    loadBlogPostWidget();
                    loadBlogViewWidget();
                    loadBlogCommentsWidget();
                });
            });
        }
        else {
            $.when(initBlogInformation()).done(function () {
                window.WidgetManager.populateWidget(PageId, moduleReference);
                loadBlogPostWidget();
                loadBlogViewWidget();
                loadBlogCommentsWidget();
            });
        }
    };
    var loadBlogIndexMenuWidget = function () {
        if (UtilModule.allowDebug) { debugger; }
    };
    var loadBlogPostWidget = function () {
        var widgetOptions = {};
        widgetOptions.type = "BlogPostWidget";
        widgetOptions.container = PageId + "#BlogPostWidgetContainer";

        var settings = {};
        settings.UserId = 1;
        widgetOptions.settings = settings;

        window.WidgetManager.loadWidget(widgetOptions);
    }
    var loadBlogViewWidget = function () {
        var widgetOptions = {};
        widgetOptions.type = "BlogViewWidget";
        widgetOptions.container = PageId + "#BlogViewWidgetContainer";

        var settings = {};
        settings.UserId = 1;
        widgetOptions.settings = settings;

        window.WidgetManager.loadWidget(widgetOptions);
    };

    var loadBlogCommentsWidget = function () {
        var widgetOptions = {};
        widgetOptions.type = "BlogCommentsWidget";
        widgetOptions.container = PageId + "#BlogCommentsWidgetContainer";

        var settings = {};
        settings.UserId = 1;
        widgetOptions.settings = settings;

        window.WidgetManager.loadWidget(widgetOptions);
    };

    var initBlogList = function () {
        $.when(getBlogPosts()).then(function (results) {
            if (UtilModule.allowDebug) { debugger; }
            BlogPostList = results.Record;
            console.log(BlogPostList);
        });
    };
    var getBlogPosts = function () {
        if (UtilModule.allowDebug) { debugger; }
        var d = new $.Deferred();

        var uri = '/Blog/GetBlogPosts?userId=' + currentUser.UserId;

        $.post(uri).done(function (returnData) {
            if (UtilModule.allowDebug) { debugger; }
            if (returnData.Status == "OK") {
                BlogPostList = returnData.Record;
                BlogPostList.map(x => {
                    if (UtilModule.allowDebug) { debugger; }
                    x.UserName = window.Community.getUserProfileObject().UserName;
                    if (x.Comments != null) {
                        x.CommentsObject = JSON.parse(x.Comments);
                        x.CommentsCount = x.CommentsObject.length;
                    }
                });
                console.log(returnData.Record);
                d.resolve("ok");
            } else {
                window.Community.showNotification("Error", returnData.Record, "error");
                d.resolve("error");
            }

        });

        return d.promise();
    };
    var initBlogInformation = function () {
        //debugger;
        var d = $.Deferred();
        getBlogPosts().then(getBlogModelTemplate()).then(function () {
            d.resolve("ok");
        });
        return d.promise();
    };
    //Get Blog Model
    var getBlogModelTemplate = function () {
        var d = new $.Deferred();

        var uri = '/Blog/GetBlogModel';

        $.post(uri).done(function (returnData) {
            blogPostInfo = returnData.Record;
            d.resolve("ok");
        });
        return d.promise();
    };


    return {
        init: init,
    };

})();

Ошибка, которую я выделил ниже

, поэтому проблема в функции инициализации BlogModule, которая является BlogModule.init (), страница слишком долго простаивает, и я перезагружаю ее, я получаю следующую ошибку: не могу позвонить window.Community.getUserInfo () с неопределенным значением, подразумевающее, что сообщество не определено после нескольких обновлений все в порядке, и проблема не произойдет, если я не изменю разумную часть кода для js-файлов, чтобы он снова компилировался браузером или браузер не работал слишком долго, и я не могу понять, что вызывает эту проблему.

ниже лог из консоли

enter image description here

enter image description here

p.s. ошибка возникает чаще, если я обновляю страницу с помощью f5, но редко случается, если я обновляю страницу с помощью ctrl + f5

Пожалуйста, любая помощь будет иметь большое значение

1 Ответ

0 голосов
/ 13 мая 2019

Отвечая на мой собственный вопрос, потребовалось время, чтобы разобраться, но с моей стороны это была небольшая ошибка, просто исправление следующей функции в Util.js исправило ее для меня

  var properlyLoadScript = function(scriptPath, callBackAfterLoadScript) {
      //get the number of `<script>` elements that have the correct `src` attribute
      //debugger;
      var d = $.Deferred();
      $('script').each(function() {
          console.log($(this).attr('src'));
      });
      if (typeof window.Community == 'undefined') {
          //debugger;
          console.log('community was undefined till this point');
          //the flag was not found, so the code has not run
          $.when(forceReloadScript('/Scripts/Application/Community.js')).done(function() {
              //debugger;
              $.when(forceReloadScript(scriptPath)).done(function() {
                  callBackAfterLoadScript();
              });
              d.resolve("ok");
          });
      } else {
          console.log('Community loaded already and running now : ' + scriptPath);
          $.when(forceReloadScript(scriptPath)).done(function() {
              callBackAfterLoadScript();
          });
      }
      return d.promise();
  };
...