2017-04-21 62 views
0

我有這樣的功能:使用Javascript - 返回的項目後,AJAX總是不確定的

function get_non_authorized_bulk_edit_option_values() { 
     var modificable_column_names = get_write_user_values(); 
     alert(modificable_column_names); 
} 

它調用此一個(我沒貼的所有細節,如XML變量的內容或功能的OnError):

function get_write_user_values() { 
    var request = $.ajax({ 
          type: "POST", 
          async: false, 
          url: "model/_get_user_groups_info_pipe.php", 
          data: xml, 
          contentType: "text/xml; charset=utf-8", 
          dataType: "json", 
          success: OnSuccess, 
          error: OnError 
    }); 


    function OnSuccess(data,status,request) { 
     var modificable_column_names = []; 

     $.each(data.column_name, function(index, value) { 
      modificable_column_names.push(value); 
     }); 

     alert(modificable_column_names); 

     return modificable_column_names; 
    } 
} 

當我警告modificable_column_names數組時,它在get_write_user_values()函數中工作,但不在get_non_authorized_bulk_edit_option_values()函數中(我得到未定義)。 我嘗試使用對象或字符串而不是表,但我有同樣的問題。 爲什麼它不工作?

PS:我有一個同步調用,因爲在繼續之前我絕對需要這個函數的結果(我知道這不是最好的選擇)。

+0

永遠不要使用'async:false'。這是一個可怕的做法,已被棄用。查看瀏覽器控制檯中的警告。從來沒有任何需要使用它。 – charlietfl

+0

@Max請檢查我編輯的答案 – gaganshera

+0

由於'get_write_user_values'不會返回任何東西,所以您會得到'undefined'。 –

回答

0

你實際上並沒有從get_write_user_values()函數返回任何東西。此函數只是啓動ajax調用並立即返回,即使在ajax調用完成之前也會返回undefined。在某個階段,您的onSuccess函數將與數據一起被調用,但在該階段,您的get_non_authorized_bulk_edit_option_values()函數已經運行並處理了未定義的值。你需要使用ajax提供的promise api。

function get_write_user_values() { 
    var promise = $.ajax({ ... }) // remove the success and error handlers 
    .then(onSuccess, onError) 

    function onSuccess(data) { 
     // do stuff to the data 
     return processed_data; 
    } 
    function onError(err) { 
     console.log('An error with the api'); 
     return err; 
    } 

    return promise; 
} 

function get_non_authorized_bulk_edit_option_values() { 
    get_write_user_values() 
    .then (function (processed_data) { 
     alert(processed_data); 
    }); 
} 

這將確保在get_non_authorized_bulk_edit_option_values的代碼將等待數據從Ajax調用執行其警報之前到達。如果你不熟悉jQuery的承諾,請閱讀https://api.jquery.com/deferred.then/

+0

謝謝。我試過,但我得到:「未捕獲的ReferenceError:onSuccess未定義」,即使我剛好在onSuccess函數後面(並且成功和錯誤處理程序從ajax聲明中除去)。 – Max

+0

檢查你的函數名稱的大小寫,我注意到你的OnSucces,首都O,我的是小寫。 ALso小忍者編輯返回承諾,這是至關重要的:) – fluoresce

+0

是的,我想知道它要去哪裏。完美,現在它正在工作!非常感謝。 – Max