2

わかりました、そのタイトルはおそらく私の質問をうまく説明していません。うまくいけば、これは理にかなっています。これは jQuery を使用した初めてのアプリケーションでもあります。

私は次の機能を持っています:

function getRandomImages(limit) {
    imagesArray = new Array();
    $.getJSON('createImageArray.php', {limit: limit}, function(data) {
        $.each(data, function(i) {
            imagesArray[i] = data[i];  //imagesArray is declared globally.
        });
    }); 
}

getJSON は JSON オブジェクトを正しく取得しています。次のようなものが返されます。

{"image0":"images/19.10.FBB9.jpg","image1":"images/8.16.94070.jpg","image2":"images/8.14.47683.jpg","image3":"images/8.15.99404.jpg","image4":"images/8.13.20680.jpg","image5":"images/21.12.9A.jpg","image6":"images/8.17.75303.jpg"}

私はデバッグを行っていましたが、JSON オブジェクトから取得したイメージ パスが data[i] に正しく含まれていると確信しています。しかし、getRandomImages() が呼び出された後、グローバル imagesArray を確認すると、何も変更されていないことがわかります。実際のイメージを取得するのではなく、imagesArray のコピーを作成していると思います。

グローバル imagesArray が $.each ブロックで更新されるようにするには、何をする必要があるか教えてもらえますか? どういうわけか参照によって imagesArray を渡す必要がありますか? 申し訳ありませんが、私は少し迷っています。

助けてくれてありがとう。

編集:いくつかの背景情報。DB からランダムな画像の場所の配列を設定しています。画像が多すぎるため、データベースから配列にすべての画像を一度にロードしたくありません。そのため、画像配列のどこにいるかを追跡するカウンターがあります。画像の処理が完了したら、ポインターを次の画像に移動します。最後に到達したら、さらにランダムな画像を取得する必要があります。ここで、上記の js 関数が呼び出されます。これは、db から x 個のランダムな画像を取得して配列を返す createImageArray.php を呼び出します。次に、これらの画像の場所をグローバル imagesArray に格納します。

.getJSON の非同期性を考慮してコードを再構築する方法がわかりません。

4

5 に答える 5

5

ここで何が起こるかというと、getJSONが非同期的に呼び出されます。したがって、関数はすぐに戻り、その中のコードは後で呼び出されます。imagesArray が更新されるのはそのときだけです。

getJSON を同期的に動作させることもできますが、お勧めしません。代わりに、AJAX 要求の非同期性を考慮してコードを再構築することをお勧めします。

編集:同期リクエストを作成するには、asyncオプション ( link ) を使用します。一般$.ajax機能を使用するか、AJAX グローバル オプションを設定します。これをお勧めしない理由は、ブラウザがロックされるからです。サーバーがタイムリーに応答しない場合、ユーザーはブラウザーを使用できなくなります。

コードを再構築することはそれほど難しくありません。コールバック関数で画像配列を処理するためのロジックを移動するだけです。たとえば、次の代わりに:

function getRandomImages(limit) {
    imagesArray = new Array();
    $.getJSON('createImageArray.php', {limit: limit}, function(data) {
        $.each(data, function(i) {
                imagesArray[i] = data[i];  //imagesArray is declared globally.
        });
    }); 
   processImages();
}

行う

function getRandomImages(limit) {
    imagesArray = new Array();
    $.getJSON('createImageArray.php', {limit: limit}, function(data) {
        $.each(data, function(i) {
                imagesArray[i] = data[i];  //imagesArray is declared globally.
        });
        processImages();
    }); 
}
于 2009-02-18T09:05:44.923 に答える
2

わかりました、最初は問題がわかりませんでした。少しハッキーですが、コードについて詳しく知らなくても、imagesArray を作成するときに bool imagesLoaded.

function getRandomImages(limit) {
    imagesArray = new Array();
    imagesLoaded = false;
    $.getJSON('createImageArray.php', {limit: limit}, function(data) {
        $.each(data, function(i) {
                imagesArray[i] = data[i];  //imagesArray is declared globally.
        });
        imagesLoaded = true;
    }); 
}

次に、getRandomImages() を呼び出した後、imagesLoaded = true になるまで setTimeout() を使用してコードを保持パターンに入れます。ああ、おそらく、ユーザーがあなたのアプリが壊れたと思わないように、ページに何らかの読み込みグラフィックを配置してください。

于 2009-02-18T17:08:30.440 に答える
0

まず第一に:なぜグローバル変数を使用しているのですか?それは悪い考えです、それをしないでください。次のように、特定の名前空間内の関数間で変数を共有できます。

var NAMESPACE = {};
NAMESPACE.example = function() { 

    var myField = '1';

    return { 

        someMethod: function() { 
             return myField;
        }, 

        anotherMethod: function() { 
            return myField;
        } 
    };
}();

次に、配列がフェッチされた後、どうしますか?ページなどに画像を表示しますか?配列に入れる代わりに、ページのimg-elementsにアクセスできますか?

于 2009-02-18T15:56:12.423 に答える
0

これを試して:

function getRandomImages(limit) {
    imagesArray = new Array();
    $.getJSON('createImageArray.php', {limit: limit}, function(data) {
        $.each(data, function(i, val) {
                imagesArray[i] = val;  //imagesArray is declared globally.
        });
    }); 
}
于 2009-02-18T09:06:06.390 に答える
-1

多分この作品、私にはうまくいく.. :)

$variable= new array();

$.getJSON("url", function(data){
asignVariable(data);
}

function asignVariable(data){
$variable = data;
}

console.log($variable);

それがあなたを助けることを願っています.. :)

于 2012-02-01T16:11:02.673 に答える