2016-04-13 115 views
-1

我試圖將<textarea>中的HTML保存爲電子郵件模板。這可以在多個地方完成,所以我想創建一個save_email_template()函數,它可以接收參數並根據需要進行保存(我已經完成了這項工作)。爲從AJAX調用utlizies DATA參數的函數定義回調

我也想在每次調用save_email_template()函數時指定一個回調函數。該捕獲是在我想要以各種方式處理save_email_template()函數內的ajax調用返回的data的回調中。

這裏是我的代碼:

function save_email_template(options,callback){ 

    $.ajax({ 
     type: "POST", 
     url: '/save_email_template.php', 
     data: options.params, 
     success:function(data) { 

     if (typeof callback === 'function') { 
      callback(data); 
     } 
     } 
    }); 
} 


    save_email_template({ 
     params: { 
     'action':'add', 
     'eid':$('input#id').val(), 
     'title':$('input#name').val(), 
     'html':$('textarea#html').val() 
     } 
    }, function(data){ // <---- "Data" Not Defined 

     if (typeof data.html_issues !== 'undefined') { 
      console.log('HTML Issues:\n------------------'); 
      console.error(data.html_issues); 
     } 

     if (typeof data.css_issues !== 'undefined') { 
      console.log('CSS Issues:\n------------------'); 
      console.error(data.css_issues); 
     } 

     if (data.status == "OK") { 
      $('body').append(data.html); 
     } else { 
      if (typeof data.error_msg !== 'undefined') 
       alert(data.error_msg); 

      if (data.status == "ERROR") 
       console.error(data); 
     } 
    }); 

問題:

我不斷收到JS錯誤 ' 「數據」 沒有定義',其引用我的回調...此代碼function(data){...}。 Obviosly data尚未定義,但如何參考在AJAX調用中返回的data

+2

不要將回調函數傳遞到'save_email_template()'函數中。相反,從函數返回ajax調用,並在[jqXHR](http://api.jquery.com/jQuery.ajax/#jqXHR)上寫入'.done()'或'.then()返回。 – dave

+1

@dave TBH,回調沒有問題... DigitalMC:我不清楚這個問題,我不明白你爲什麼會得到這個錯誤。那是完整的代碼嗎? –

+0

@dave不需要將'save_email_template()'函數放入變量來訪問返回值?我對如何設置它有點困惑。 – DigitalMC

回答

1

不要將回調傳遞到save_email_template()函數中。相反,從函數返回ajax調用,並在返回的jqXHR上寫入.done().then()處理函數。這使您可以調用該函數並在代碼的相同區域中定義回調邏輯。

function save_email_template(options){ 
    return $.ajax({ 
     type: "POST", 
     url: '/save_email_template.php', 
     data: options.params 
    }); 
} 

save_email_template(options).then(function(data) { 
    //write your callback logic here 
});