2

javascript内の「制御フロー」に関するベストプラクティスについて少し助けが必要です。次の例では、saveData関数がまだ完了していないため、updateUI関数が正しく機能していません。

function save(data){
   saveData(data);
   updateUI();
}

一時的な修正のために、私はこれを行いました

function save(data){
if(saveData(data)){
   updateUI();
   }
}

更新:これが私のsaveDataメソッドです

function saveData(data){

$.ajax({
    url: url, // a variable, not important for this example
    data: data,
    type: "post",
    dataType: "json",
    success: function(data) { return true; },
    error: function(e) {
        console.log(e);
    }
})

そのようなものがあれば、私は「標準的な」方法を学ぶべきだと感じています。

4

3 に答える 3

3

saveDataそれがAJAX関数(たとえば)を呼び出していると仮定して$.ajax、そのAJAX関数の結果を返すようにします。

function saveData() {
    return $.ajax({
        url: url, // a variable, not important for this example
        data: data,
        type: "post",
        dataType: "json"
    }).fail(function(e) {
        console.log(e);
    });
}

次に、jQueryの遅延チェーンを使用してUIを更新します。

saveData().done(updateUI).fail(showError);

これにより、コールバック関数をsaveData呼び出しに渡す必要がなくなり、データ保存ロジックをUIロジックから完全に分離できます。

編集 私はコードを更新して、fail遅延オブジェクトも使用してデフォルトハンドラーを含める方法を示しましたがpromise、UIの更新を外部で処理できるように返します。

于 2012-07-19T21:12:27.170 に答える
0

これは、saveDataが非同期メソッドであるためです。oncompleteイベントでupdateUI()を呼び出す必要があります。

この記事を見て、 promise()を読んでください

于 2012-07-19T21:08:57.137 に答える
0

これを行うにはいくつかの方法があります。

saveDataメソッドにコールバック関数を提供できます。これは、saveDataが完了したときに呼び出すものです。

var saveData = function(data, cb){
    // do something with data to save it
    cb.apply(this, ['arguments', 'as', 'an','array']); // or use .call instead
}

いくつかのイベントを実装して、updateUIメソッドがイベントをリッスンするようにすることができます。イベントが発生すると、updateUIが実行され、saveDataが終了したときに発生します。jQueryは、バックボーンと同様に1つを提供します。

これを実現する方法はたくさんあります。自分に最適な方法を選択してください。

于 2012-07-19T21:09:40.050 に答える