0

したがって、このロングポーリングの良い例を見つけましたが、それを介して変数を転送する方法を理解できませんでした。これは私が思いついたものですが、機能しません。私が変更したコードの一部であるため、問題はdataStringとtypeにあるとかなり確信しています。

$(".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
    });
})();​

誰かが私がここで間違っていることを教えてもらえますか?どんな助けでもありがたいです、ありがとう。

4

3 に答える 3

2

poll()関数がグローバルスコープに登録されることはありません。これは、「」構文で囲まれているためです。これは(...)()、基本的に「...引数なしで「」を呼び出して忘れることを意味します。

于 2012-04-17T23:25:21.873 に答える
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
        });
    })
})();
于 2012-07-31T09:07:51.890 に答える
2

の範囲に関してpoll、ヘゲモンの答えはほとんど正しいです。関数はグローバルではありません。しかし、それだけではありません。

あなたが書いた方法は、名前付き関数式pollとして知られているものになります。

JavaScript で関数を記述するには 2 つの方法があることに注意してください。従来の関数宣言:

function foo() {
    ...
}

宣言には名前を付ける必要があり、一番上に上げられます (基本的に、命令が実行される前に解析されます)。または、関数式:

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

名前付き関数式はそれ自体しか呼び出せない (またはそのスコープ内で宣言された関数によって呼び出される) という事実に加えて、ブラウザーのバグのホスト全体のために、名前付き関数式は、デバッガーまたはプロファイラーでコンテキストを追加する以外では実質的に役に立ちません。 .


それでは、コードを見ていきましょう。

まず、postクラスを持つ各要素について説明します。jQuery は、一致する要素ごとに匿名のコールバックをすぐに呼び出します。を呼び出そうとしますpollが、次のようになります。

  1. 関数式が巻き上げられていないため、まだ存在しません。コードはpollまだ実行されていません。
  2. 既に実行されていたとしても (たとえば、$.each呼び出しを一番下に移動した場合)、postは名前付きの関数式であるため未定義のままpollであり、これらの識別子は関数自体の内部でのみ使用できることがわかりました。

次に、自己実行機能があります。(()最後の行の ) つまり、poll引数なしですぐに呼び出されます。おそらく、単一のロング ポール送信が表示されpid=undefinedます。

おまけ:コールcompleteバック (一度タイムアウトした後、またはデータを取得した後に新しいロングポールを開始する)poll、その時点で適切に範囲内にあるため、期待どおりに機能します。

このナンセンスをすべて修正するのは、3 文字を削除するのと同じくらい簡単です。願わくば、この時点までに、それらがどの 3 文字であるかを理解できるようになっていることを願っています。(ヒント: 式を宣言にします。)

于 2012-04-18T00:27:02.890 に答える