1

わかりましたので、jQuery を使用して do-while ループを作成しました。基本的に、そのポイントは、ディレクトリに写真があることを確認し、それを配列に追加することです。ディレクトリの写真はすべて「phone01.png」、「phone02.png」などの名前で、「slides」というディレクトリにあります。

コードは次のとおりです。

var images = [];
var i=0;

    do {
        ++i;
        $.get('./slides/phone0' + i + '.png',function(){
            images[(i-1)] = './slides/phone0' + i + '.png';
        });
    }
    while ( images[(i-1)] == './slides/phone0' + i + '.png' );

したがって、最後にコンソールを使用すると、images[] には「./slides/phone01.png」しか含まれませんが、

私は1です

したがって、images[(i-1)] は './slides/phone0' + i + '.png' です。

( images[(i-1)] == './slides/phone0' + i + '.png' )リターンを入力しますtrue。したがって、while ステートメントは true ですが、ループは継続していません。

さらに、手動でループを再度実行すると (i を繰り返し、get を実行)、get は成功し、新しいメンバーが配列に追加されます。そのため、do 関数が 2 回実行されることはありません

何を与える?

4

3 に答える 3

3

$.get は非同期リクエストです。したがって、イメージ配列が期待どおりに設定されないため、ループは常に 1 回実行されます。

于 2012-10-22T20:09:53.150 に答える
1

これは古典的な非同期の問題です。

を呼び出し$.get()ても、指定した関数にすぐには入りません。

何が起こるかというと、HTTPリクエストを設定し、リクエストが成功したときに呼び出す関数としてその関数をリクエストにアタッチします。

その後、プログラムの元の部分はそれ自体のビジネスを継続し、HTTPリクエストとそれが渡した関数を忘れます。

この場合、プログラムの元の部分はwhileループです。関数が渡されると、whileループを続行してループします。

ループの各反復で作成される関数は、(a)HTTPリクエストが正常に応答し、(b)実行中の残りのJavascriptコードがスレッドのブロックを停止し、実行する機会を与えるまで起動されません。 。

これは非同期コードと呼ばれ、最初の「A」、「AJAX」という用語です。また、Javascriptのイベント処理モデル全体がどれだけ機能するか、およびjQueryに表示されるすべてのネストされた関数でもあります。(これは、コードが間違った順序で実行されているように見える他のケースも説明している可能性があります)。

非同期コードでこのようなループを実行する場合は、まったく別の方法で記述する必要があります。これまでにwhile記述した従来のループは機能しません。

やるべきことはたくさんありますが、コードを提供するだけでなく、この全体がどのように機能するかをもう少し掘り下げることをお勧めします。Ajaxコードを作成する場合は、このことを理解する必要があるからです。 。

ただし、ヒントを1つ挙げておきます。グローバル変数は、通常、この種のプログラムではそれほど有用ではありません。コードサンプルから変数がグローバルであるかどうかは明らかではありませんが、グローバルである場合は、変数を1つの場所に設定するだけでなく、ローカル変数にして関数間で渡すことを検討する必要があります。別で働くために。

お役に立てば幸いです。

于 2012-10-22T20:18:30.623 に答える
1

まず、すぐに呼び出される関数式がどのように機能するかをまだよく理解していないので、次のことを試しました。

var i=0;

do {
    ++i;
    (function(iteration){
        $.get('./slides/phone0' + i + '.png',function(){
            images[(i-1)] = './slides/phone0' + i + '.png';
        });
    })(i);
}
while ( images[(i-1)] == './slides/phone0' + i + '.png' );

while ループ内で GET の評価を強制しようとする...無駄に。以下に落ち着きました。これがどれほど効果的/クリーンであるかについての考えは大歓迎です。C の観点から考えすぎている可能性があります (関数内の関数! -- ここに Xzibit ミームを挿入してください)。しかし、これは仕事を成し遂げます:

var i=0;

function createArray(){
    $.get('./slides/text0' + (i+1) + '.txt',function(data){
        texts.push(data);
    });
    $.get('./slides/phone0' + (i+1) + '.png',function(){
        images[i] = new Image();
        images[i].src = './slides/phone0' + (i+1) + '.png';
        i++;
        createArray();
    }).error(function(){
        slider();
    });
}
于 2012-10-24T06:35:19.267 に答える