1

Jquery 各ループ内で API への外部 AJAX 呼び出しを実行しようとしています。

ここに私がこれまでに持っているコードがあります。

getStylesInfo(tmpMake, tmpModel, tmpModelYear, tmpSubmodel).done(function(data){
    var holder = [];

    $.each(styles, function(index, value) {
        var tempValue = value;
        var temp = getNavigationInfo(value.id);

        $.when(temp).done(function(){
            if(arguments[0].equipmentCount == 1){
                holder.push(tempValue);
                console.log(holder);
            }
        });
    });
});

console.log(holder);

function getStylesInfo(make, model, year, submodel){
    return $.ajax({
    type: "GET",
    url: apiUrlBase + make + '/' + model + '/' + year + '/' + 'styles?  fmt=json&' + 'submodel=' + submodel + '&api_key=' + edmundsApiKey + '&view=full',
   dataType: "jsonp"
});   


function getNavigationInfo(styleId){
    return $.ajax({
    type: "GET", 
    url: apiUrlBase + 'styles/' + styleId + '/equipment?availability=standard&name=NAVIGATION_SYSTEM&fmt=json&api_key=' + edmundsApiKey,
    dataType: "jsonp"
});   

getStylesInfo() は、これに似たものを返します。車のモデルに関する情報を含むオブジェクトの配列。

var sampleReturnedData = [{'drivenWheels': 'front wheel drive', 'id': 234321}, {'drivenWheels': 'front wheel drive', 'id': 994301}, {'drivenWheels': 'rear wheel drive', 'id': 032021}, {'drivenWheels': 'all wheel drive', 'id': 184555}];  

sampleReturnedData をループして、getNavigationInfo() 関数を使用した別の AJAX 呼び出しで各 ID をパラメーターとして使用しようとしています。

結果をループしてチェックしたい。true の場合は、オブジェクト全体をホルダー配列にプッシュします。

問題は、関数の外側の console.log(holder) が空の配列を返すことです。if ステートメント内の console.log(holder) は正しく機能します。

これがスコープ/巻き上げの問題なのか、それとも deferred の使用方法の問題なのかわかりません。

私はこの質問を読みましたが、多くの人が気に入っています。彼らはどちらかを使用することを提案します

async:false

または、コードをより適切に書き直す。コンソールデバッガーを何度も試して使用しました。falseに設定したくありません。正確に何が起こっているのかわかりません。

この記事を介して巻き上げについても読みました。

それは deferred に関係していると思いますが、それを理解するのに十分な JS の知識がありません。

ありがとう!

4

1 に答える 1