ハンドラー (コールバック)、処理するオブジェクト、およびオブジェクトにデータを収集する 4 つの関数があります。私の場合、4 つのデータ リトリーバーを非同期的に呼び出し、4 つすべての実行が完了したら、結果のオブジェクトを処理します (次のようなもの)。
var data = {};
function handle (jsObj) {}
// data retrieving
function getColorData () {}
function getSizeData () {}
function getWeightData () {}
function getExtraData () {}
data.color = getColorData();
data.size = getSizeData();
data.weight = getWeightData();
data.extra = getExtraData();
handle( data );
もちろん、このコードは正しく動作しません。また、データ取得関数を連鎖させると、次々と呼び出されてしまいますよね?4 つの関数はすべて非同期で呼び出す必要があります。実行時間が長すぎて 1 つずつ呼び出すことができないためです。
更新しました:
皆さんの提案に感謝します!私は を好み$.Deferred()
ましたが、必要な方法で機能させるのは少し難しいと感じました。私が必要としているのはview
、4 種類のデータ ( extraData
、colorData
、sizeData
& weightData
) を必要とする を非同期的に作成することであり、3 つのオブジェクトApp
、Utils
&がありTools
ます。
簡単な説明:は、コールバックとして渡されたview
呼び出しによって作成されます。の本体のコールバックはのみ呼び出されます。コールバックとして渡される前に呼び出されます。App.getStuff
App.handleStuff
App.getStuff
$.when(App.getExtraData(), App.getColorData(), App.getSizeData(), App.getWeightData())
Utils.asyncRequest
Tools.parseResponse
App.get*Data()
では、ここでの問題は、それぞれの内部およびそれぞれから 4 つの遅延オブジェクトを作成する必要return deferred.promise()
があるかどうかです。そしてdeferred.resolve()
、注文の最後の関数に入れるべきですか(Tools.parseResponse
私App.getExtraData
の例では)?
var view,
App,
Utils = {},
Tools = {};
// Utils
Utils.asyncRequest = function (path, callback) {
var data,
parseResponse = callback;
// do something with 'data'
parseResponse( data );
};
// Tools
Tools.parseResponse = function (data) {
var output = {};
// do something to make 'output' from 'data'
/* So, should the deferred.resolve() be done here? */
deferred.resolve(output);
/// OR deferred.resolve();
/// OR return output;
};
// App
App = {
// Only one method really works in my example
getExtraData : function () {
var deferred = new jQuery.Deferred();
Utils.asyncRequest("/dir/data.txt", Tools.parseResponse);
return deferred.promise();
},
// Others do nothing
getColorData : function () { /* ... */ },
getSizeData : function () { /* ... */ },
getWeightData : function () { /* ... */ }
};
App.getStuff = function (callback) {
$.when(
App.getExtraData(),
App.getColorData(),
App.getSizeData(),
App.getWeightData()
)
.then(function (extraData, colorData, sizeData, weightData) {
var context,
handleStuff = callback;
// do something to make all kinds of data become a single object
handleStuff( context );
});
};
App.handleStuff = function (stuff) { /* ... */ };
/// RUN
view = App.getStuff( App.handleStuff );
上記の例のコードが機能するとは思っていませんでした。これは説明のためのものです。
私は長い間静かにこれを解決しようとしてきましたが、まだ結果が得られません。残念ながら、これに関するドキュメントjQuery.Deferred()
と議論は役に立ちませんでした。ですから、どんな助けやアドバイスもいただければ幸いです。