2010-04-10 51 views
2

我試圖長時間輪詢ajax調用,背對背。目前我這樣做的問題是,我從前一個調用的回調函數中進行了每個連續的調用。這是一個問題嗎?即使認爲數據已返回並執行回調,Firebug也不會顯示我的任何ajax調用已完成。遞歸結構似乎效率低下。有任何想法嗎?背靠背ajax長輪詢沒有遞歸回調函數

window.addEvent('domready', function() 
{ 
    server = new Request({ 
    url: "chat.php", 
     method: 'get', 
     link: 'ignore', 
     onSuccess: callback, 
    }); 

    request = server.send(); 
} 

function callback(data) 
{ 
    console.log(data); 
    var data = JSON.decode(data); 
    messId = data.max; 
    for(var i = 0; i < data.messages.length; i++) 
    { 
     print("", data.messages[i].text); 
    } 
    var sendString = "messId="+messId; 
    request = server.send(sendString); 
} 
+0

urs的某些代碼可能會對您有所幫助... – 2010-04-10 04:18:35

+0

如果您的ajax實現使用iframe來處理請求,那麼您應該到'net'面板查看請求,它們不會顯示在控制檯面板 – Dapeng 2010-04-10 04:23:49

回答

1

你是對的,你必須保持無目的的堆棧和關閉,當你做長輪詢這種方式,並根據不同的情況和實現你可能會得到一個堆棧溢出或至少低上運行內存......儘管我不確定各種js實現的優化性能(例如尾部遞歸會使這些問題消失)。

簡單的選擇是使用window.setTimeout(funcName),當全局作用域解析當前作用域時,它將立即調用函數funcName

+0

所以我換成了: request = server.send(sendString); 與: window.setTimeout(「recieve()」); 並且功能仍然沒有完成。 – Teddy 2010-04-10 04:47:48

+0

等待,因爲它是一個異步請求,回調函數應該完成,對吧? – Teddy 2010-04-10 04:51:29

+0

是的,他們應該完成。除非請求超時......而不是完成?你至少可以嘗試改變你的最後一行到這個'window.setTimeout(function(){server.send(sendString)});'雖然我不認爲這些調用是遞歸的,但瀏覽器的HTTP請求是異步的,就像你說的。 – 2010-04-10 08:12:58