1

API を使用していて、新しいページを提供するために、最初の応答の 1 つと 2 番目の応答が必要です。私が直面している問題は、変数 $x が常にループ内の最後の # に設定されていることです。つまり、この特定のケースでは 103 です。これが私のコードです:

$.ajax({
dataType: 'text',
type: 'post',
url: 'getAllMessages.php',
success: function(responseData) {
    var newString = responseData;
    var newerString = newString.substring(0, newString.length - 1);
    $newObject = jQuery.parseJSON(newerString);
    //console.log($newObject);
    for($x = 0; $x < $newObject.messages.length; $x++){
        $.ajax({
            data: {clientFolderId: $newObject.messages[$x].clientFolderId, messageId: $newObject.messages[$x].messageId},
            dataType: 'text',
            type: 'post',
            url: 'testapi.php',
            success: function(responseData2){
                //alert($x);
                var newString2 = responseData2;
                var newerString2 = newString2.substring(0, newString2.length - 1);
                $newObject2 = jQuery.parseJSON(newerString2);
                if($newObject2.statistics.delivered > 1000){
                    console.log($newObject.messages[$x]);
                    console.log($newObject2);
                }
            },
            error: function(responseData2){
                alert('failure in testapi.php');
            }
        });
    }
},
error: function(responseData) {
    alert('failure in getAllMessages.php');
}

});

4

2 に答える 2

3

私の直感では、別の機能スコープ内に Ajax 呼び出しをネストすると (Matt のおかげで修正されました)、予期しない動作が解決されると言われています。私はこのすでにオブジェクトの作成がループで壊れていることにやけどを負いました。展開作品

こちらも例 #5: http://www.javascriptkit.com/javatutors/closures2.shtml

エンジニアから与えられたパターンに従って、

for($x = 0; $x < $newObject.messages.length; $x++){

   (function($x) {

    $.ajax({
        data: {clientFolderId: $newObject.messages[$x].clientFolderId, messageId: $newObject.messages[$x].messageId},
        dataType: 'text',
        type: 'post',
        url: 'testapi.php',
        success: function(responseData2){
            alert($x);
            var newString2 = responseData2;
            var newerString2 = newString2.substring(0, newString2.length - 1);
            $newObject2 = jQuery.parseJSON(newerString2);
            if($newObject2.statistics.delivered > 1000){
                console.log($newObject.messages[1]);
                console.log($newObject2);
            }
        },
        error: function(responseData2){
            alert('failure in testapi.php');
        }
    });

   })($x);
}
于 2012-04-30T18:47:38.237 に答える
0

あなたが経験しているのは閉鎖です。ループが回転すると、の値$xが更新されます。ただし、ajax関数がそれを取得するようになると、参照を使用します。したがって、あなたが見つけるように、あなたは最後の値で終わります。

もっと機能的に考えてみてください。あなたは何をしようとしているのですか?あなたがしようとしているとしましょうpostMessage-それを関数でラップし、メッセージを渡します。

コードが読みやすくなり、変数が壊れることがなくなります。

私はいくつかのコードを捨てようとしていましたが、私が明確にしたいことに気づきました-あなたは両方のループでインデックスを使用してメッセージ配列から単一のメッセージを取得していますが、POSTtestapi.phpは単一のメッセージで機能しているようですか?それからどのような反応が期待されますか?

 更新:デモ問題へのjsFiddleを作成

ここにあなたを助けるためのいくつかのコードがあります。

    function correctOutputPlox(id) {
     setTimeout(function() {
       $("#output").append("<li>" + id + "</li>");
     }, 500);   
    }

    function runNicely() {
        // same loop...
        for (var x = 0; x < 10; x++) {
            // but rather than use 'x' (which is going to change, we pass it's value into a function which doesn't have access to the original 'x' since it's in a different lexical scope.
            correctOutputPlox(x);
        }
    }

    function showProblem() {
        for (var x = 0; x < 10; x++) {
            setTimeout(function() {
                $("#output").append("<li>" + x + "</li>");
            }, 500);
        }
    }

    showProblem();
    runNicely();
于 2012-04-30T18:56:46.987 に答える