2016-12-16 88 views
-2

我想申請的getStatus功能就在這裏:通AJAX數據到另一個功能

function getStatus(id) 
{ 
    $.ajax({ 
     method: "POST", 
     url: '<?php echo base_url('marketplace/get_store_status'); ?>/'+id, 
     dataType: 'json', 
     success: function(data){ 
      return data.status; 
     } 
    }); 
} 

進入這個功能就在這裏:

$('#store-status').click(function() { 
    var id = getStatus(<?php echo $vendor->store_id; ?>); 
    if (id == 1) { 
    $('#btn-status') 
     .removeClass('btn-danger') 
     .addClass('btn-primary') 
     .text('Activate'); 
    } else { 
     $('#btn-status') 
     .removeClass('btn-primary') 
     .addClass('btn-danger') 
     .text('Deactivate'); 
    } 
    console.log(id); 
    $('#modal-status').modal('show'); 
}); 

但是當我登錄的id變量的元素點擊功能進入控制檯,它顯示undefined

但是,當我從getStatus函數本身記錄成功數據時,它顯示正確的數據。我在代碼中做錯了什麼?

+1

在<?php echo $ vendor-> store_id中返回什麼值? ?>'? – Black

+0

曾聽說過回調 – Beginner

+1

Ajax中的getStatus代表異步。這意味着發送請求(或接收響應)將從正常執行流程中取出。在你的例子中,$ .ajax立即返回,並且在成功回調函數傳遞的函數被調用之前執行下一條語句return result;。 **可能的解決方案** 基本上有兩種方法可以解決這個問題: 使AJAX調用同步(讓我們稱它爲SJAX)。 重構您的代碼以使用回調正常工作。 – user3790694

回答

2

Ajax調用是異步的。您需要傳遞迴調。

你可以把它同步的太多,但延緩你的頁面,如果呼叫需要更長的時間

function getStatus(id, callback) 
{ 
    $.ajax({ 
     method: "POST", 
     url: '<?php echo base_url('marketplace/get_store_status'); ?>/'+id, 
     dataType: 'json', 
     success: function(data){ 
      callback && callback(data.status); 
     } 
    }); 
} 


$('#store-status').click(function() { 
    var id = getStatus(<?php echo $vendor->store_id; ?>, function(id), { 
    // the code here 
}); 

}); 
+0

什麼是&&在做什麼?爲什麼需要? – Black

+1

這是一個if語句。 'callback &&'檢查回調是否存在,如果是,則執行'callback(data.status)'。如果沒有,請忽略它。它可以防止調用不存在並導致錯誤的函數。這是一個健全的檢查;) –

+0

不錯,很高興知道:) – Black

-1

的問題可能會導致的問題是,經過var id = getStatus(<?php echo $vendor->store_id; ?>);運行你的代碼,而不必等待迴應,因爲你做異步調用。 一種解決方案是將async設置爲false以使呼叫同步,但不建議這樣做。

$.ajax({ 
    method: "POST", 
    async: false, 
    url: '<?php echo base_url('marketplace/get_store_status'); ?>/'+id, 
    dataType: 'json', 
    success: function(data){ 
     return data.status; 
    } 
}); 

另一個更好的解決方案是使用回調函數。

+0

是比其他更好,導致現有的代碼不會需要重組。 – Beginner

+0

這種方式實際上沒有達到20倍,總是使用回調函數,如@Rene Pot在他的回答中所示。但它是一種選擇。 – Black

+0

在解決這個問題的〜5種不同的解決方案中,'async:false'是最簡單和最糟糕的方法。 **這會凍結選項卡,直到HTTP通話返回,這可能需要幾秒鐘** –

相關問題