如何在间隔内停止对函数的多次调用?

时间:2016-02-22 06:36:31

标签: javascript angularjs typescript angular-ui-router

我怎样才能确保一次调用一个函数的一次调用?

我的代码如下所示:

var promisePutTestQuestion;

   onEnter: ['$interval', 'questionService',
             ($interval, qus: IQuestionService) => {
      promisePutTestQuestion = $interval(() => {
         qus.putTestQuestionResponses();
      }, 5 * 1000);
   }],
   onExit: ['$interval',
            ($interval) => {
             $interval.cancel(promisePutTestQuestion);             
   }],

我遇到的问题是如果putTestQuestionResponse(返回一个promise)很慢,那么我有一个接一个的多个putTestQuestionResponse函数调用。

如果有人对此有任何想法,我将不胜感激。感谢

1 个答案:

答案 0 :(得分:1)

在javascript中,为此目的使用状态变量是安全的。每当var操作花费大量时间,下次调用将被跳过。所以只需保持处理变量的正确状态,如果它是真的,则退出间隔回调而不再运行任务。

qus.putTestQuestionResponses

不确定您正在使用哪种承诺框架,但var promisePutTestQuestion; let processing = false; onEnter: ['$interval', 'questionService', ($interval, qus: IQuestionService) => { promisePutTestQuestion = $interval(() => { if (processing) return; processing = true; qus.putTestQuestionResponses() .then(() => processing = false) }, 5 * 1000); }], onExit: ['$interval', ($interval) => { $interval.cancel(promisePutTestQuestion); }] 应该是() => processing = false我想是$ q,而finally()应该是then之后catch 1}}以确保它在任何情况下都被执行。 所以其中之一:

qus.putTestQuestionResponses().finally(() => processing = false)

qus.putTestQuestionResponses().catch(...).then(() => processing = false)`

甚至

qus.putTestQuestionResponses().then(() => processing = false).catch(() => processing = false)