2016-11-02 9 views
0

私はajax呼び出しを次のように関数に一般化しようとしています。私は前にこれをしていないし、私はそれを正しくやっているかどうか確かではない。私はここで何をしようとしている関数へのajax呼び出しの一般化

<script> 
    $(document).ready(function(){ 
    var reg_no=$("#reg_no").val(); 
    reg_no=reg_no.trim(); 
    if(reg_no!==""){ 
     //populate fields 
     data={reg_no:reg_no,func:"getSupplierDetails"}; 
     success_function="updateFormFields"; 
     ajax_call(data,success_function); 
    } 
}); 

function ajax_call(data,success_function){ 
    $.ajax({ 
     type:"POST", 
     url:"../control/supplier-c.php", 
     dataType:"json", 
     data:data, 
     success:function(data){ 
      success_function(data); //variable function works?? 
     } 

    }); 
} 

function updateFormFields(data){ 
    //some code here to handle data array 
} 
</script> 

は、データ配列、成功時に実行される関数を渡すことで、全体のAjaxコードを書き換えないようです。私が行ったように、可変関数の使用がわかりません。

updateFormFields()コードがajax呼び出しの成功ハンドラに移動され、ajax_call()が別の関数として定義されていないが、その直後に実装されていれば、ajax呼び出しのすべてが機能することに注意してくださいコメントは「フィールドに値を設定する」。私はちょうどこの方法でそれを試して経験がないと私はこれが可能かどうかを知る必要があります。

はあなたが成功機能をラップする必要はありません

+0

あなたの質問は、成功についての場合:コールバックは、それが動作します...しかし、あなたは '成功行うことができます。success_function'代わり –

+0

私が見るに、私は探していましたajax_call()内の同じコード行を複数回再入力しないようにします。私は私のウェブサイトでもう少しajaxコールを持っています – user3889963

答えて

2

Javascriptでは、関数はファーストクラスのオブジェクトであり、パラメータとして渡すことができます。

ajax_call(data, updateFormFields); 

をし、期待どおりに動作するはずです:

function json_post(url, data, success_function, error_function) { 
    $.ajax({ 
     type:"POST", 
     url:url, 
     dataType:"json", 
     data:data 
    }).then(success_function, error_function); 
} 

次に、あなたはあなたのケースでは

json_post("../control/supplier-c.php", { data: "data" }, function (res) { 
    console.log('Ajax req successful'); 
    console.log(res); 
}, function (res) { 
    console.log('Error in ajax req'); 
    console.log(res); 
}); 

としてそれを呼び出すことができます、あなたが行うことができます。

+0

私の実装方法が間違っていることを間違って確認できますか?廃止された成功コールバックの使用ではありません。私の実装はうまくいきません。 – user3889963

+0

はい、実装が間違っています。ここでjquery ajaxのドキュメントをチェックしてください。http://api.jquery.com/jquery.ajax/#jQuery-ajax-settings 'success'の場合、' success'はStringでなくFunctionでなければなりません。 – Ananth

0

、あなただけのそれを直接適用する適用することができますありがとうございました。

function ajax_call(data, success_function) { 
    $.ajax({ 
     ... 
     success: success_function 
    }); 
} 

さらに良いアイデアは、レガシーsuccesserrorコールバックを避け、代わりにjQueryの約束を返すことです。標準的な約束の方法.then()と `を使うことができます。

function ajax_call(data) { 
    return $.ajax({ 
     ... 
    }); 
} 

ajax_call() 
    .then(function(data) { 
     // this runs if it succeeds 
    }) 
    .fail(function(err) { 
     // this runs if it failed 
    }); 

約束は、チェーンことができるというコード平らになって、「クリスマスツリーのコールバック」の巣を回避するための巨大な利点を持っています。

+0

しかし、関数ajax_call(data、success_function)では、変数success_functionは文字列です。あなたが言ったように書かれたとき、それは機能として実行されるのだろうか? – user3889963

0

サーバレスポンス(XHR)エラーも処理するには、success_functionfailure_functionの両方をチェックすることをお勧めします。

function success_function(){ 
 
    //code to handle success callback 
 
} 
 

 
function error_function(){ 
 
    //code to handle failure callback 
 
} 
 

 
function ajax_call(data, success_function, error_function) { 
 

 
    if (typeof success_function === 'function' && typeof error_function === 'function') { 
 
    $.ajax({ 
 
     type: "POST", 
 
     url: "../control/supplier-c.php", 
 
     dataType: "json", 
 
     data: data, 
 
    }).then(success_function).fail(error_function); 
 
    } 
 
}

関連する問題