質問

遅延を使用するか、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);
});
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top