2012-05-04 73 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」將會是全局對象。

像其他人所建議的那樣,您需要將實際的函數傳遞給您的計時器,而不是字符串。那麼你可以從你想要的任何對象中引用任何函數。