2

mvFinishItUp()2 つの条件が満たされたときに特定の関数を実行する必要があります。より具体的には、1 つの条件はコールバックの成功であり$.ajax、もう 1 つは関数に到達するまでのコードの通常の流れです。これのようなもの:

$.ajax({
    url: mv_finalUrl,
    success: function (data) {
        mvFinishItUp(data);
    },
    dataType: 'html'
});

/* here a lot more code, with animations and some delays */

mvFinishItUp(data) {
    /* My function code */
    /* But this code must only run after it has been called via the call back
       and after all the other code has been ran as well */
}

したがって、ajax コールバックの方が速い場合、またはその逆の場合、関数はすべてのコードを待機する必要があります。これをどのように実装できるかについてのアイデアはありますか?

私はスクリプトコードの概念全体を喜んで変更します.ajax間のコードが緩んでいると信じているので、関数自体も関数に移動する必要があります...

4

5 に答える 5

6

これは、jQuery Deferred オブジェクトの完璧な使用例です。

AJAX 呼び出しからパラメーターを削除し、success:後でハンドラーを登録します。

var jqxhr = $.ajax(...); 

// do some other synchronous stuff
...

// and *then* register the callback
jqxhr.done(mvFinishItUp);

遅延オブジェクトは、AJAX イベントが既に終了した後にそのイベントに登録されることに (設計上) 完全にうまく対応します。

于 2012-06-01T15:02:59.907 に答える
0

たぶん、次のようなことがうまくいくでしょう:

var _data = undefined;

$.ajax({
    url: mv_finalUrl,
    success: function (data) {
        _data = data;
        myFinishItUp(data); // call the function from here if it's faster
    },
    dataType: 'html'
});

/* here a lot more code, with animations and some delays */

function myFinishItUp(data) {
    this.data = data; // store the data from the AJAX call or the code, whichever reaches first 
                      // if the code reaches this before the AJAX call completes, data will be undefined
    if(typeof this.wasCalled == "undefined") {
        /* My function code */
        /* But this code must only run after it has been called via the call back
           and after all the other code has been ran as well */
        this.wasCalled = true;
    }
}(_data); // function that calls itself when the code gets to this point with a self-contained boolean variable to keep track of whether it has already been called 

コードフローがその時点に達したときに実行する自己呼び出し関数を使用しましたが、AJAX 呼び出しから呼び出された場合、実行されません。自己完結型のブール値で既に呼び出されているかどうかを追跡します。

于 2012-06-01T14:59:19.940 に答える
0

ここでは、コールバック チェックを確認する 2 番目のパラメーターを追加します。

 function mvFinishItUp(data, byCallback) {

    var iscallback = byCallback || false; // if you don't send byCallback
                                          // default will false
    if(iscallback) {
       // execute if called by callback
    }
 }

 success: function (data) {
        mvFinishItUp(data, true); // call with second parameter true
 },

mvFinishItUp()ajaxが完了し、ajaxと完了の間のすべてのコードの後に​​実行するにmvFinishItUpは、次のようなことができます:

var allFunctionExecuted = false; // global to detect all code execution

$.ajax({
    url: mv_finalUrl,
    success: function (data) {
        mvFinishItUp(data, true);
    },
    dataType: 'html'
});

function func1() {

}

function func2() {

}

// some other code

function func3() {
    allFunctionExecuted = true;
}

今、

 function mvFinishItUp(data, byCallback) {

    var iscallback = byCallback || false; // if you don't send byCallback
                                          // default will false

    if(iscallback && allFunctionExecuted) {

       // execute if ajax done
       // and others code done
    }
 }
于 2012-06-01T14:54:21.777 に答える
0

以下のようにしてみてください(単なる疑似コードです)

var isAJAXDone = false, isFunctionCodeDone = false;
$.ajax({
  //..
  success: function () {
     isAJAXDone = true;
     mvFinishItUp(data, isAJAXDone, isFunctionCodeDone);
  } 
});

//..Your function code
//..Add this below the last line before the function ends
isFunctionCodeDone = true;
mvFinishItUp(data, isAJAXDone, isFunctionCodeDone);


//..
mvFinishItUp(data, isAJAXDone, isFunctionCodeDone ) {
   if (isAJAXDone && isFunctionCodeDone) {
      //Do your magic
   }
}
于 2012-06-01T15:07:51.957 に答える
0

これは非常に「醜い」コードですが、グローバル変数を使用しないように変更できるため、これは単なる例です。

var ajaxExecuted = false,
    codeExecuted = false;

$.ajax({
    url: mv_finalUrl,
    success: function (data) {
        ajaxExecuted = true;
        mvFinishItUp(data);
    },
    dataType: 'html'
});

/* here a lot more code, with animations and some delays */
codeExecuted = true;

mvFinishItUp(data) {
    /* My function code */
    if(ajaxExecuted && codeExecuted) {
      /* But this code must only run after it has been called via the call back
         and after all the other code has been ran as well */
    }
}

ajaxExecuted と codeExecuted の 2 つのフラグを追加し、関数内にこれらのフラグの値をチェックする if ステートメントを追加し、そのうちの 2 つが true に設定されている場合にのみ実行します。したがって、最初に呼び出す人はいません。2 つのフラグが true に設定されている場合にのみ実行されます。

よりクリーンな方法は、オブジェクトに関数を実装し、グローバル変数の代わりにプロパティを使用することです。

于 2012-06-01T15:18:35.210 に答える