2012-05-04 41 views
0

即时通讯方法setTimeOut有问题,它调用函数self并设置一个延迟,函数应该在每次请求完成后反复调用,但它只运行一次。它可以在不使用backbone.js的情况下运行,不知道在与backbone.js集成之后它不起作用。任何帮助表示赞赏!骨干javascript setTimeOut方法

所以这是一个在客户端运行GET请求的函数从服务器获取数据,请求在一个时间间隔内运行(在服务器中决定),一旦数据进入,客户端获取它并且请求运行再次之后。

getRequest:function() { 
     var XHR = $.ajax({ 
      url: '/nextdocument', 
      type: 'GET', 
      async: true, 
      cache: false, 
      timeout: 11000, 
      success:function(data) { 
       var name = data.description; 
       var price = data.price; 
       console.log("read--> " + name + price); 
       setTimeout("this.getRequest", 1000); 
       if (data.ok == "true") { 
        data["ok"] = data.ok; 
        $.ajax(
         { 
          url: "/customerdone", 
          data: JSON.stringify(data), 
          processData: false, 
          type: 'POST', 
          contentType: 'application/json' 
         } 
        ) 
       }else{ 
        //no document if no read in 
        console.log("error--> " + data.errorMessage) 
       } 
      } 
     }) 
     return XHR; 
    } 
+0

你是什么意思: if(data.ok =='true'){ data ['ok'] = data.ok; 。 。 } ?需要吗? –

+0

在setTimeout中,不要使用字符串,使用像'setTimeout(function(){namespace.getRequest()},1000)这样的匿名函数;''namespace“是一个占位符,无论您的包的名称是什么调用getRequest。 – jmort253

回答

0

可能是函数getRequest没有被调用。就我所知,这是因为你正在发送一个字符串 - “this.getRequest”给setTimeout函数。作为一个经验法则,永远不要传递字符串给这个函数。尽管在某些情况下它可能完全没问题(我永远不会推荐它),但这里可能会造成麻烦。使用这样的事情:

getRequest:function() { 
    var fn = arguments.callee; 
    var XHR = $.ajax({ 
     url: '/nextdocument', 
     type: 'GET', 
     async: true, 
     cache: false, 
     timeout: 11000, 
     success:function(data) { 
      var name = data.description; 
      var price = data.price; 
      console.log("read--> " + name + price); 
      setTimeout(fn, 1000); 
      if (data.ok == "true") { 
       data["ok"] = data.ok; 
       $.ajax(
        { 
         url: "/customerdone", 
         data: JSON.stringify(data), 
         processData: false, 
         type: 'POST', 
         contentType: 'application/json' 
        } 
       ) 
      }else{ 
       //no document if no read in 
       console.log("error--> " + data.errorMessage) 
      } 
     } 
    }) 
    return XHR; 
} 
+1

OT:考虑将回调拆分为保持代码更易读和可维护的函数。 –

1

的问题是,你是“本”在您的通话setTimeout使用。你不能这样做,因为当定时器执行你要引用的函数时,“this”将会是全局对象。

像其他人所建议的那样,您需要将实际的函数传递给您的计时器,而不是字符串。那么你可以从你想要的任何对象中引用任何函数。