2016-12-16 60 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通话返回,这可能需要几秒钟** –

相关问题