【问题标题】:javascript auto refresh using setInterval not working使用setInterval的javascript自动刷新不起作用
【发布时间】:2017-12-08 04:45:13
【问题描述】:

我有一些共享点使用的自定义 javascript 代码。我需要在页面加载后自动刷新部分页面。我尝试过使用 setInterval。这是我的功能:

define([
  'jquery',
  'knockout',
  'text!./home-page-census.html',
  'q',
  'underscore',
  'census',
  'moment',
  'sp_core',
  'bootstrap',
  '!domReady'
], function ($, ko, htmlString, Q, _, census, moment) {
    var baseUrl = _spPageContextInfo.siteAbsoluteUrl;

    function buildRequestUrl() {
        var requestUrl = baseUrl + "/_api/web/lists/GetByTitle('Census')/items?";
        var oDataSelect = "$select=Title,CensusBranch,BedAvailabilityPercentage,Modified,StatusBarColor,DisplayText,Tooltip";

        return requestUrl += oDataSelect;
    }

    function getUpdatedCensus() {
        return Q.Promise(function (resolve, reject, notify) {
            requestUrl = buildRequestUrl();
            census.getCensus(requestUrl).then(onFulfilled, onRejected);
            //setInterval(census.getCensus(requestUrl).then(onFulfilled, onRejected), 3000);

            function onFulfilled(censusResult) {
                resolve(censusResult);
            }

            function onRejected(reason) {
                reject(reason);
            }
        });
    }

    function initViewModel(viewModel) {
        getUpdatedCensus().then(onFulfilled, onRejected);

        function onFulfilled(result) {
            viewModel.censusByBranch(result);
            viewModel.isInitializing(false);
        }

        function onRejected(reason) {
            console.log(reason.message);
            console.log(reason.stack);
            viewModel.isInitializing(false);
        }
    }

    function HomePageCensusViewModel(params) {
        var self = this;
        self.isInitializing = ko.observable(true);
        self.censusByBranch = ko.observable();

        initViewModel(self);
    }

    ko.bindingHandlers.censusLastUpdatedTime = {
        update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
            var value = valueAccessor();
            var lastUpdated = ko.unwrap(value);

            $(element).text(lastUpdated.format('M[/]DD [@] h[:]mmA'));
        }
    }

    return {
        viewModel: HomePageCensusViewModel,
        template: htmlString
    };
});

【问题讨论】:

    标签: javascript jquery knockout.js setinterval


    【解决方案1】:

    setTimeout 的第一个参数必须是要调用的 函数。正如所写...

    setInterval(census.getCensus(requestUrl).then(onFulfilled, onRejected), 3000);
    

    ...census.getCensus(...) 被立即调用,返回的 promise 被传递给 setTimeout

    将它包装在这样的函数中应该可以工作......

    setInterval(function() { census.getCensus(requestUrl).then(onFulfilled, onRejected) }, 3000);
    

    还值得一提的是,在then 中使用拒绝处理程序被认为是一种不好的做法;最好使用.then(onSuccess).catch(onRejected)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-22
      • 2011-11-30
      • 1970-01-01
      相关资源
      最近更新 更多