2017-12-15 4 views
1

は私がカスケード接続関数呼び出しのjQuery

getValueListDataWithScol1(1029).done(function (kvalue) { 
    konto = kvalue; 
    getValueListDataWithScol1(1033).done(function (mvalue) { 
    mws = mvalue; 
    getValueListDataWithScol1(1101).done(function (wvalue) { 
     wirt = wvalue; 
     LoadStaticData(); 
     LoadGridData(); 
    }); 
    }); 
}); 

以下のように関数を呼び出したいが、それは私が動的配列の値に応じて、それをやりたいハードコードされています。例えば、ここでは3つのレベルの配列に4つの要素があり、別のレベルを追加し、最後の呼び出しで2つの関数を呼び出す必要があります。私はそれを達成する方法を知らない。その理由は、私はロード関数とgetValueListDataWithScol1の両方で呼び出される関数の値が必要です。基本的にはコールバック関数です

私はこのようにしようとしましたが、関数は非同期呼び出しを待っていませんでしたそれを待たせる方法。同期の呼び出しを変更することはできません。

function loaddata(ids) { 
    var d = new $.Deferred(); 
    for (var key in ids) { 
    getValueListDataWithScol1(ids[key]).done(function (value) { 
     lists[ids[key]] = value; 
    }); 
    delete ids[key]; 
    loaddata(ids) 
    } 
    d.resolve(lists); 
    return d.promise(); 
} 

答えて

2

あなたの要求は、互いに依存していないようですので、あなたはリクエストの配列をマッピングすることができますし、すべての要求が解決されたときに実行するために$.whenを使用しています。 $.when.then

引数は、元の配列と同じ順序であろう

var array = [5,2,6,4]; 
 

 
var promiseArrray= array.map(function(num, i){ 
 
    console.log('Start request #' , i+1) 
 
    return dummyRequest(num).then(function(res){ 
 
      console.log('End request #' , i+1) 
 
      return {num: num, res: res} 
 
    }); 
 
}); 
 

 
$.when.apply(null, promiseArrray).then(function(){ 
 
    var allResults = [].slice.call(arguments); 
 
    processFinalResults(allResults); 
 

 
}); 
 

 
function processFinalResults(arr){ 
 
    console.log('final results:'); 
 
    console.log(JSON.stringify(arr)); 
 
} 
 

 
function dummyRequest(num){ 
 
    var promise = $.Deferred(); 
 
     setTimeout(function(){ 
 
     promise.resolve(num * 100); 
 
     }, num * 200);// alternate delay to shuffle completion order of fake requests 
 
    return promise; 
 
}
.as-console-wrapper {max-height: 100%!important;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

関連する問題