Knockout.js 根据时间设置不运行功能的超时

Knockout.js 根据时间设置不运行功能的超时,knockout.js,Knockout.js,我使用settimeout运行函数,每10秒运行一次,直到它达到60秒并退出,出于某种原因,它没有经过设置的超时,只是退出了进程 self.startInstatorCheck = function() { self.instatorStarts(true); var MAX_WAIT_TIME_MS = 1 * 60 * 1000; var POST_INTERVAL_MS = 10 * 1000; var timeout = Date.now() + MAX_WAIT_TIM

我使用settimeout运行函数,每10秒运行一次,直到它达到60秒并退出,出于某种原因,它没有经过设置的超时,只是退出了进程

self.startInstatorCheck = function() {
  self.instatorStarts(true);
  var MAX_WAIT_TIME_MS = 1 * 60 * 1000;
  var POST_INTERVAL_MS = 10 * 1000;
  var timeout = Date.now() + MAX_WAIT_TIME_MS;

  self.proceedInstantorcheck(POST_INTERVAL_MS, timeout);
}

self.proceedInstantorcheck = function(POST_INTERVAL_MS, timeout) {
  debugger;
  var date = Date.now();
  $.ajax({
      type: 'POST',
      url: BASEURL + 'index.php/moneyexchange/check_instantor_field/' + auth,
      contentType: 'application/json; charset=utf-8'
    })
    .done(function(userinfo) {
      if (userinfo.instantor_request > 12) {
        return self.allInstantorCheckMessages('Instantor data gathered');
      } else {
        if (date < timeout) {
          /* setTimeout just moves forward and does not repeat*/
          setTimeout(self.proceedInstantorcheck(), POST_INTERVAL_MS);
        } else {
          self.allInstantorCheckMessages('Please go through instantor to ');
          self.instatorStarts(true);
          self.magicInstantorbtn2(true);
        }
      }
    })
    .fail(function(jqXHR, textStatus, errorThrown) {
      self.errorMessage(errorThrown);
    })
    .always(function(data) {

    });
}
self.startInstatorCheck=函数(){
self.instatorStarts(true);
var MAX_WAIT_TIME_MS=1*60*1000;
var POST_间隔_MS=10*1000;
var timeout=Date.now()+MAX\u WAIT\u TIME\u MS;
self.proceedInstantorcheck(后间隔、超时);
}
self.proceedInstantorcheck=函数(后间隔、超时){
调试器;
var date=date.now();
$.ajax({
键入:“POST”,
url:BASEURL+'index.php/moneyexchange/check_instantor_field/'+auth,
contentType:'application/json;charset=utf-8'
})
.done(函数(用户信息){
如果(userinfo.instantor\u请求>12){
返回self.allInstantorCheckMessages(“收集的实例化器数据”);
}否则{
如果(日期<超时){
/*setTimeout只向前移动,不重复*/
setTimeout(self.proceedInstantorcheck(),POST_INTERVAL_MS);
}否则{
self.allInstantorCheckMessages('请通过instantor to');
self.instatorStarts(true);
self.magicInstantorbtn2(真实);
}
}
})
.fail(函数(jqXHR、textStatus、errorshown){
self.errorMessage(error抛出);
})
.始终(功能(数据){
});
}

我正在使用两个函数,因为第一个函数获取数据,第二个函数每次都会重新运行,而不会获取新的超时值。

setTimeout
获取指向函数的指针,不应将调用该函数的结果传递给它

这个

应该是

setTimeout(self.proceedInstantorcheck, POST_INTERVAL_MS);

setTimeout
获取指向函数的指针,不应将调用该函数的结果传递给它

这个

应该是

setTimeout(self.proceedInstantorcheck, POST_INTERVAL_MS);

您没有正确使用
setTimeout
。它的第一个参数是
函数
。如果此函数需要参数,则必须使用
.bind
或用其他方法包装来传递参数。下面是一个工作示例(请注意,我模拟了ajax部分并减少了间隔和超时时间)

注:

  • 按RunCodeSnippet以查看它是否正常工作
  • 此代码不能防止您同时运行多个
    startCheck
    s。确保你只打一次电话
  • 模拟的ajax代码有一个500毫秒的固定超时,因此每隔1000毫秒(
    POST\u INTERVAL\u MS
    )+500毫秒=1500ms调用一次
    proceedCheck
    )。由于我们在6000毫秒后停止重试,因此我们有5次尝试:
    • 试试1:0毫秒
    • 尝试2:500毫秒
    • 试试3:2000毫秒
    • 尝试4:3500ms
    • 试试5:5000毫秒
    • 试试6:6500ms
//模拟jQuery ajax,不包括
var$={
ajax:函数(opts){
返回{
完成:功能(cb){
setTimeout(cb.bind)(空{
“instantor_请求”:10
}), 500);
}
};
}
},i=0;
//逻辑是:
var startCheck=函数(){
var MAX_WAIT_TIME_MS=1*6*1000;
var POST_间隔_MS=1*1000;
var timeout=Date.now()+MAX\u WAIT\u TIME\u MS;
过程检查(后间隔、超时);
};
var proceedCheck=功能(间隔、限制){
console.log(“检查”+i++);
$.ajax({})
.done(函数(用户信息){
如果(userinfo.instantor\u请求>12){
console.log(“有效请求”);
}否则{
if(Date.now()<限制){
setTimeout(函数(){
过程检查(间隔、限制);
},间隔);
}否则{
日志(“请求超时”);
}
}
})
}

斯塔切克()您没有正确使用
setTimeout
。它的第一个参数是
函数
。如果此函数需要参数,则必须使用
.bind
或用其他方法包装来传递参数。下面是一个工作示例(请注意,我模拟了ajax部分并减少了间隔和超时时间)

注:

  • 按RunCodeSnippet以查看它是否正常工作
  • 此代码不能防止您同时运行多个
    startCheck
    s。确保你只打一次电话
  • 模拟的ajax代码有一个500毫秒的固定超时,因此每隔1000毫秒(
    POST\u INTERVAL\u MS
    )+500毫秒=1500ms调用一次
    proceedCheck
    )。由于我们在6000毫秒后停止重试,因此我们有5次尝试:
    • 试试1:0毫秒
    • 尝试2:500毫秒
    • 试试3:2000毫秒
    • 尝试4:3500ms
    • 试试5:5000毫秒
    • 试试6:6500ms
//模拟jQuery ajax,不包括
var$={
ajax:函数(opts){
返回{
完成:功能(cb){
setTimeout(cb.bind)(空{
“instantor_请求”:10
}), 500);
}
};
}
},i=0;
//逻辑是:
var startCheck=函数(){
var MAX_WAIT_TIME_MS=1*6*1000;
var POST_间隔_MS=1*1000;
var timeout=Date.now()+MAX\u WAIT\u TIME\u MS;
过程检查(后间隔、超时);
};
var proceedCheck=功能(间隔、限制){
console.log(“检查”+i++);
$.ajax({})
.done(函数(用户信息){
如果(userinfo.instantor\u请求>12){
console.log(“有效请求”);
}否则{
if(Date.now()<限制){
setTimeout(函数(){
过程检查(间隔、限制);
},间隔);
}否则{
日志(“请求超时”);
}
}
})
}

斯塔切克()
如果要提供这两个参数,请将其封装在一个(匿名)函数中:
setTimeout(function(){self.proceedInstantorcheck(POST\u INTERVAL\u MS,timeout);},POST\u INTERVAL\u MS)
@Jamiec,我试过了,它仍然没有调用proceedInstantorcheck,它只是跳过它,而调试。@Farhana等等,当您点击
setTimeout
时,您是否希望执行停止,直到该ha