javascript
  • jquery
  • ajax
  • long-polling
  • .post
  • 2012-04-17 79 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 
         }); 
        }) 
    })(); 
    
    相关问题