javascript
  • jquery
  • ajax
  • long-polling
  • .post
  • 2012-04-17 20 views 0 likes 
    0

    所以我發現這個長輪詢的好例子,但我無法弄清楚如何通過它傳遞變量。這是我想出來的,但它不起作用。我非常確定這個問題與dataString和type有關,因爲那是我修改的代碼的一部分。長查詢ajax結構問題

    $(".post").each(function() { 
        poll("somestuff"); 
    }); 
    
    
    (function poll(pid) { 
        var dataString = 'pid=' + pid; 
        $.ajax({ 
         type: 'GET', 
         url: 'http://localhost:8888/site/execs/something.php', 
         data: dataString, 
         success: function(data) { 
    
          alert('stuff'); 
    
    
         }, 
         dataType: "json", 
         complete: poll, 
         timeout: 30000 
        }); 
    })();​ 
    

    有人可以告訴我我在做什麼錯嗎?任何幫助表示讚賞,謝謝。

    回答

    2

    關於poll的範圍,hegemon的回答大多是正確的–該函數不是全局的。但是,還有更多。

    你寫的方式poll使它成爲所謂的命名函數表達式

    請記住,在JavaScript中編寫函數有兩種方法。傳統函數聲明

    function foo() { 
        ... 
    } 
    

    聲明必須被命名,並hoisted頂端(基本上,分析執行任何指令之前)。可替代地,函數表達式

    var foo = function() { 
        ... 
    } 
    

    或者

    $.ajax('/', function() { 
        // this is what's known as an anonymous callback 
    }); 
    

    或者

    (function() { 
        // this is called a self-executing function... 
    })(); // <-- because we call it immediately 
    

    表達式像任何其他代碼執行;他們沒有被吊起來。

    現在有趣的部分:函數表達式可能會被賦予一個可選的名稱,但該名稱不能在函數本身的範圍之外訪問。換句話說,

    (function foo() { 
        // `foo` is this function 
    }); 
    
    // `foo` will be undefined here 
    

    會非常喜歡寫這樣的:

    (function() { 
        var foo = arguments.callee; // never do this 
        // `foo` is this function 
    }); 
    
    // `foo` will be undefined here 
    

    因爲一個事實,即一個命名函數表達式只能調用自身的(或在其範圍內聲明的函數調用) ,加上a whole host of browser bugs,命名函數表達式在調試器或分析器中添加一些上下文之外實際上是無用的


    所以現在我們來看看你的代碼。

    首先,您將瀏覽每個具有post類的元素。 jQuery立即爲每個匹配元素調用您的匿名回調函數。您嘗試撥打電話號碼poll,但它:

    1. 由於函數表達式不會被懸掛;代碼尚未運行,poll
    2. 即使它已經運行(例如,如果您將$.each調用移動到底部),post仍然未定義,因爲poll是一個命名的函數表達式,我們剛剛瞭解到這些標識符僅在函數內部可用本身。

    接下來,你有一個自我執行的功能。 (最後一行爲())。換句話說,poll立即被調用,沒有參數。您可能會看到一個長期調查發送pid=undefined

    獎勵:complete回調(後一個超時開始一個新的長查詢或獲取數據)確實按預期方式工作,因爲poll是正常範圍在這一點上。

    解決所有這些無稽之談就像刪除三個字符一樣簡單。希望通過這一點你可以找出那三個字符。 (提示:使你的表達的聲明)

    +0

    我不知道我是否真的知道我應該做什麼。我刪除了4個字符,最後是(最後)(),但是這個工作只有一次。它立即執行,但似乎在此之後再次執行。所以連接不會保持打開狀態,然後一次失敗...... – Ian 2012-04-18 04:49:22

    2

    poll()函數永遠不會在全局範圍內註冊。這是因爲它被「(...)()」構造所包含,其基本意思是:稱爲「...」,沒有參數並忘記。

    +0

    這個答案在'poll'不是全局的。然而,說這是因爲這些原因(甚至是自我執行功能)有點誤導。我發佈了更多的[回覆](http://stackoverflow.com/a/10201107/201952)。 – josh3736 2012-04-18 00:29:16

    2

    有點晚了也許回答...

    範圍問題之外,你的查詢功能不投票。這只是一個Ajax請求。

    要調查你需要調用setTimeout。所以你的代碼如下所示:

    (function poll(pid) { 
        var dataString = 'pid=' + pid; 
        setTimeout(function() { 
         $.ajax({ 
          type: 'GET', 
          url: 'http://localhost:8888/site/execs/something.php', 
          data: dataString, 
          success: function(data) { 
    
           alert('stuff'); 
    
    
          }, 
          dataType: "json", 
          complete: poll, 
          timeout: 30000 
         }); 
        }) 
    })(); 
    
    相關問題