オートコンプリートの結果を返すために呼び出される関数のキューを作成しようとしています。それらのいくつかは $.getJSON 呼び出しから自分で構築した関数であり、いくつかはjQuery UI autocomplete に指定されたものを使用して外部開発者から提供されました。
たとえば、ここに提供されている偽物があります。それが本当に非同期なのか、それともいつコールバックを呼び出す可能性があるのか 、前もってわかりません。
var providedFunction = function(search, response) {
setTimeout(function() {
var arr = ['One', 'Two', 'Demo Custom'];
response($.grep(arr, function (s) { return s.indexOf(search) === 0; }));
},5000);
};
次に、それをいくつかの他の $.getJSON 呼び出しと組み合わせて、リスト全体が終了するまで続行しないようにします。
var searchTerm = "Demo";
var allResults = [];
var functionQueue = [];
functionQueue.push(
$.getJSON( 'http://ws.geonames.org/searchJSON?featureClass=P&style=short&maxRows=50&name_startsWith=' + searchTerm)
.success( function(data) {
$.each(data.geonames, function(i,d) {
allResults.push(d.name); });
})
);
functionQueue.push(
providedFunction(searchTerm, function(data) {
allResults.push.apply(allResults, data);
})
);
// wait for all asyc functions to have added their results,
$.when.apply($, functionQueue).done(function() {
console.log(allResults.length, allResults);
});
問題は、提供された関数が完了するまで $.when が待機しないことです。すべての $.getJSON 呼び出しが完了するとすぐに戻ります。明らかに、提供された機能を正しく配線していませんが、その方法がわかりません。