0

たとえば、都市など、人の特定の興味を知るモバイル アプリケーションを開発しています。したがって、アプリケーションはたとえばニューヨークを認識します。

panoramio api でニューヨークの写真を検索したいのですが、そのためにはニューヨーク市の座標を知る必要があります。だから私は次のことをします:

geocoder.geocode( { 'address': places[j].name}, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK){
        var request = $.ajax({type:"GET",
                             url: "http://www.panoramio.com/map/get_panoramas.php?set=public&from=0&to=20&minx="+ (results[0].geometry.location.lng()-distance) +"&miny="+ (results[0].geometry.location.lat()-distance)+"&maxx="+ (results[0].geometry.location.lng()+distance) +"&maxy="+ (results[0].geometry.location.lat()+distance) +"&size=medium&mapfilter=true",
                             dataType: "jsonp",
                             success : function(){
                                   if(typeof places[j] !== "undefined")
                                        succeeded.push(places[j].name);
                                   }
                             });
                            requestPlaces.push(request);
    }
});

これは、特定の人が持っている興味の量をループする for ループ内にあります。places[j].name興味の名前です。distance私が写真を撮りたい場所からの閾値です。ここまでは順調ですね。

次に、すべての情報を requestPlaces 配列に収集したいと考えています。requestPlaces は次のように宣言されています。

var requestPlaces = [];

そして、実行されたすべてのリクエストをその配列にプッシュして、後でできるようにします。

$.when.apply(null, requestPlaces).done(function () {
    console.log("tamanho do request places: dentro do when apply" + requestPlaces.length);
    console.log(arguments);

});

ここに問題があります。iの内部では、$.when.apply(null, requestPlaces)サイズ 0 と引数を空の配列にしています。すべてのリクエストが完了して requestPlaces の配列にプッシュされるのを待っているわけではないようです。これを解決するにはどうすればよいですか?

いくつかの考慮事項:

このコード ブロックは、別の $.when.apply ブロック内にあり、人の興味を取得するための別のリクエストが機能しています。

また、私が panoramio api に対して行っているリクエストが成功した結果を返し、$.when.apply(null, requestPlaces)最初に入力することとは関係がないことも事実として知っています。

必要に応じて理解を深めるための完全なコード:

for(var j = 0; j<places.length; j++){
    geocoder.geocode( { 'address': places[j].name}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK){

                var request = $.ajax({
                        type:"GET",
                        url: "http://www.panoramio.com/map/get_panoramas.php?set=public&from=0&to=20&minx="+ (results[0].geometry.location.lng()-distance) +"&miny="+ (results[0].geometry.location.lat()-distance) +"&maxx="+ (results[0].geometry.location.lng()+distance) +"&maxy="+ (results[0].geometry.location.lat()+distance) +"&size=medium&mapfilter=true",
                        dataType: "jsonp",
                        success : function(){
                             if(typeof places[j] !== "undefined")
                                 succeeded.push(places[j].name);
                        }
                });
                requestPlaces.push(request);
        }
    });

}

$.when.apply(null, requestPlaces).done(function () {
        console.log("size" + requestPlaces.length);
        console.log(arguments);
});
4

1 に答える 1