関数を延ばすためのjQueryに延期を使用した場合の問題
-
21-12-2019 - |
質問
遅延を使用するか、jQueryスクリプトを使用しても本当に苦労しています。私はここにいくつかの記事をここに行っていました(api.jquery.comを含む)そして私はちょうどあなただけの初心者であると思います。
スクリプトの前の機能が完了するまで、機能を実行するのを延期しようとしています。
私は
を持っていますfunction datapoints () {
//My long function here where I define $data
};
.
その結果、結果は$ DATAという名前の配列です。次の関数に入る定義されるべき$データ変数が必要なので、延期します。
このような延期を設定しようとしました:
var deferred = $.Deferred();
deferred.resolve(datapoints());
deferred.done(function result (){
// My function here where I use $data
}
);
.
これを掃除する方法についてのいくつかのポインタに感謝します。さまざまな例を再作成しましたが、結果は毎回$データが未定義であると言っているコンソールエラーです。私は最初の関数を実行する前に数秒のSetTimeoutを手動で置くときにコードが機能することを知っていますすべてがうまく機能しますが、繰り返しはより良い解決策です。
事前にありがとう!
解決
このようなコードを修正してみてください:
deferred.done(function result (data){
// Do not use global $data, use local 'data' instead
}
);
.
これは、使用しているデータが実際にはdatapoints()
によって返されたデータです。
また、datapoints()
が非同期関数でない限り、書き込まれたコードはJSスレッドをブロックします(すなわち、ブラウザで実行された場合は、UIをブロックします)。
同期機能を備えた約束/遅延はそれほど使い切らない。
通常のパターンはこのようなものになるでしょう:
function datapoints() {
var d = $.Deferred()
asyncCallToCreateDatapoints(function callback(data) {
d.resolve(data)
})
return d;
}
datapoints().done(function result(data) {
/* do stuff with data */
})
. 他のヒント
このコードを試してみてください:
function datapoints () {
var deferred = $.Deferred();
/* later, when data is ready, call:
deffered.resolve(data);
*/
return deferred.promise();
}
datapoints().then(function () {
// runs when data is ready
})
. あなたの問題が何であるかを確かにしていませんが、この jsfiddle は私にとってうまく機能しています。
function datapoints () {
//My long function here where I define $data
return {"datapoint1": 1, "datapoint2": 2};
};
var deferred = $.Deferred();
deferred.resolve(datapoints());
deferred.done(function result (data){
// My function here where I use $data
console.log("data: ", data);
});
. 所属していません StackOverflow