【问题标题】:Execute a block only when a code has not been executed in 3 seconds只有在 3 秒内没有执行代码时才执行块
【发布时间】:2017-07-09 11:58:44
【问题描述】:

如果3 seconds 已通过并且block 1 中的angular.bootstrap() 尚未完成,我想在我的代码中实现一个承诺,以在block 2 中运行angular.bootstrap(),但前提是。

我有两段代码:

// block 1:
Office.initialize = function (reason) {
    $(document).ready(function () {
        angular.bootstrap(document, ['myApp'])
    })
}

// block 2:
$(document).ready(function () {
    angular.bootstrap(document, ['myApp'])
})

有人知道怎么做吗?

编辑 1: 只是为了澄清Office.initialize 可能永远不会执行(即,当应用程序作为加载项加载到 Office 中时)。在这种情况下,我仍然想在 3 秒内执行 angular.bootstrapblock 2

【问题讨论】:

  • 这听起来真的很像XY problem。为什么首先需要两个不同的调用来引导?也不需要在 jQuery 中包装 angular ready
  • Here 是我需要两个不同电话的原因...
  • @charlietfl 我刚刚删除了angular ready 以简化代码,谢谢...

标签: javascript jquery angularjs promise bluebird


【解决方案1】:

您可以在 JavaScript 中使用 setTimeout()clearTimeout() 函数。

函数用法:

设置超时:

setTimeout(function, time);`
//function is the function to execute
//time is the duration to wait (in milisecods) before executing the function

清除超时:

clearTimeout(id);`
//id is the id of the setTimeout block to stop from executing

这是在代码中实现函数的方式:

// block 1:
var wait = setTimeout(myFunction, 3000);
Office.initialize = function (reason) {
  $(document).ready(function () {
      angular.element(document).ready(function () {
          angular.bootstrap(document, ['myApp'])
          clearTimeout(wait);
      })
  })
}

// block 2:
function myFunction() {
  angular.element(document).ready(function () {
      angular.bootstrap(document, ['myApp'])
}

【讨论】:

  • 谢谢...但是Office.initialize 可能永远不会执行(当程序在 Office 中加载时)。在这种情况下,我仍然希望 angular.bootstrapblock 2 在 3 秒内执行。
  • 是的。要解决这个问题,您可以将let wait = setTimeout(myFunction(), 3000); 语句移动到第一块中Office.initialize 之前的行那里,它现在在答案中实现。
  • (请使用var而不是let)...奇怪,我刚刚实现了这个,但似乎myFunction总是被执行立即
  • 应该是setTimeout(myFunction, 3000);myFunction 后面没有括号。
  • 使用括号,它立即调用函数,然后将返回值传递给计时器。它不会等待破坏整个目的的计时器。 setTimeout() 期望您将函数引用传递给它。传递myFunction() 会立即执行该函数,并传递setTimeout() 执行该函数的结果。这是 Javascript 中的常见错误。当你想立即执行它时,只在函数名后使用括号。如果您只是传递函数引用以便稍后执行,请不要在其后使用括号。
【解决方案2】:

此解决方案使用 underscorejs once 函数。写一个类似的函数,

var bootstrapInit = _.once(function(){
angular.bootstrap(document, ['myApp']);
});

现在,您可以在块 1、块 2 和 setTimeout 中调用此函数,时间为 3 秒。无论哪个先调用此函数,都会执行该函数,其余调用将是虚拟调用。

【讨论】:

    猜你喜欢
    • 2012-03-30
    • 2019-12-03
    • 2013-06-09
    • 2018-09-23
    • 1970-01-01
    • 2022-01-25
    • 2015-12-03
    • 2021-05-07
    • 1970-01-01
    相关资源
    最近更新 更多