0

私はこれを持っています:

var myError;

function getNames(user,location){
    myError=null;

    //Make an Ajax Call (this takes some time)
    //On Success do this:
        if(//Some Condition){
            myError=false;
        }else{
            myError=true
        }
}

function first(){
    getNames(user, location);

    if(myError==false){ //MYCONDITION
        //do some custom stuff just for first();
    }else{
        alert("Failed");
    }
}

function second(){
    getNames(user, location);

    if(myError==false){ //MYCONDITION
        //do some custom stuff just for second();
    }else{
        alert("Failed");
    }
}

これで、first()またはsecond()を呼び出すと、常にアラートメッセージ「FAILED」が表示されます。問題は、getNames()関数が終了する前に//MYCONDITIONが実行されていることです。// MYCONDITIONをチェックする前に、getNames()が実行されるのを待ちたい。

getNames()にかかる時間がわからないため、遅延を設定できません。jQquery関数の使用を考えていましたが、見つからないようです。

そして、私はgetNames()を可能な限り一般的なものにしようとしています。だから、私はgetNames()を邪魔しない方法を考えています。

私が見る最後のオプションは、getNames()にcallback()を追加することです。ただし、この関数は、callback()を必要としない他の関数によっても呼び出されています。

何か考えはありますか?

ありがとう。

4

2 に答える 2

3

コールバックを追加しても問題ありません。存在するかどうかを確認できます:

function getNames(user, location, callback){
    myError=null;

    //Make an Ajax Call (this takes some time)
    //On Success do this:
        if(//Some Condition){
            myError=false;
        }else{
            myError=true
        }

        if(callback) {
           callback.apply();
        }
}

アリティが十分に汎用的でないことに悩まされている場合は、関数に引数の代わりにオブジェクトを受け入れるようにさせることができます。

function getNames(options) {
    var user = options.user;
    var location = options.loacation;
    var callback = options.callback;

    myError=null;

    //Make an Ajax Call (this takes some time)
    //On Success do this:
        if(//Some Condition){
            myError=false;
        }else{
            myError=true
        }

        if(typeof callback !== "undefined") {
           callback.apply();
        }
}

を呼び出すとgetNames、次のことができます。

getNames({
    user: "some user",
    location: "some location",
    callback: function() {
        ...
    }
});

また

getNames({
    user: "some user",
    location: "some location"
});
于 2012-09-13T16:24:58.080 に答える
1

jquery では、コールバックが気に入らない場合 (気に入らないことを強く願っています :) )、幸運を祈ります。$.ajax() 関数には、特定の AJAX リクエストの非同期をオフにするために使用できるフラグがあります。以下はコードサンプルです:

http://api.jquery.com/jQuery.ajax/

var x = 1;
jQuery.ajax({
     url:    'http://example.com/catalog/create/',
     success: function(result) {
                x = 59;
              },
     async:   false
});

console.log(x);    //Should print 59 instead of 1
于 2012-09-13T16:28:48.847 に答える