Javascript 将ajax数据传递给另一个函数

Javascript 将ajax数据传递给另一个函数,javascript,Javascript,我想在这里应用getStatus函数: function getStatus(id) { $.ajax({ method: "POST", url: '<?php echo base_url('marketplace/get_store_status'); ?>/'+id, dataType: 'json', success: function(data){ return data.sta

我想在这里应用
getStatus
函数:

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');
});
函数getStatus(id)
{
$.ajax({
方法:“张贴”,
url:“/”+id,
数据类型:“json”,
成功:功能(数据){
返回数据状态;
}
});
}
在此处输入此函数:

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');
});
$(“#存储状态”)。单击(函数(){
var id=getStatus();
如果(id==1){
$(“#btn状态”)
.removeClass('btn-danger')
.addClass('btn-primary')
.text(“激活”);
}否则{
$(“#btn状态”)
.removeClass('btn-primary')
.addClass('btn-danger')
.text(“停用”);
}
console.log(id);
$('模态状态').modal('显示');
});
但是,当我将元素单击函数中的
id
变量记录到控制台中时,它会显示
undefined


但是当我从getStatus函数本身记录成功数据时,它显示了正确的数据。我的代码做错了什么?

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
});

});
函数getStatus(id,回调)
{
$.ajax({
方法:“张贴”,
url:“/”+id,
数据类型:“json”,
成功:功能(数据){
回调&回调(data.status);
}
});
}
$(“#存储状态”)。单击(函数(){
变量id=getStatus(,函数id){
//这里的代码
});
});

问题是您的代码在
var id=getStatus()之后在不等待响应的情况下运行,因为您进行了异步调用。
一种解决方案是将
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;
    }
});
$.ajax({
方法:“张贴”,
async:false,
url:“/”+id,
数据类型:“json”,
成功:功能(数据){
返回数据状态;
}
});

另一个更好的解决方案是使用回调函数。

中返回什么值?听说过回调吗Ajax中的getStatus代表异步。这意味着发送请求(或者更确切地说接收响应)将从正常执行流中删除。在您的示例中,$.ajax立即返回下一条语句return result;,在调用作为成功回调传递的函数之前执行。可能的解决方案基本上有两种方法来解决这个问题:使AJAX调用同步(让我们称之为SJAX)。重新构造你的代码,使之能正确地处理回调。那为什么人们会对我的答案投反对票呢?lel@EdwardBlack从
返回的值是一个数字EP比另一个要好得多,因为现有代码不需要重新构造。不,实际上,这种方法的速度要慢20倍,始终使用回调函数,如@Rene Pot在其答案中所示。但这是另一种选择。在这个问题的5种不同解决方案中,
async:false
是最简单也是最糟糕的方法。这将冻结选项卡,直到HTTP调用返回,这可能需要几秒钟的时间,但这是一个有效的解决方案,因此不需要向下投票。&&正在做什么?为什么需要它?它是一个if语句<代码>回调&
检查回调是否存在,如果存在,则执行
回调(data.status)
。如果没有,忽略它。它可以防止调用不存在的函数并导致错误。这是一个健全的检查;)很好,很高兴知道:)谢谢,我现在就试试。