Jquery - 在全局变量中传递json对象

时间:2014-07-09 13:35:17

标签: jquery ajax json global-variables

我正在尝试从ajax调用中传递一个json对象,该变量将在另一个函数中使用。

问题是,如果我尝试console.log()该变量($ aR),则返回“undefined”

以下是代码:

$aR = '';

// Submit Data to ncbi.
// Sends form's data to classController.php
function NCBI_submit_data()
{
    $formData = $('#blastx_form').serialize();
    $php_method = 'ncbi_request';    
    $finalData = $formData + "&php_method=" + $php_method;
    $aR = ajaxReq('POST','../../classes/classController.php',$finalData,'json');
    console.log($aR);
}


// General Ajax function
function ajaxReq($method,$url,$data,$dataType)
{
    $.ajax({
        type: $method,
        url:  $url,
        async: 'false',
        data: $data,
        dataType: $dataType,
        success: function(json, textStatus, jqXHR)
        {
            $aR = json;
        },
        error: function(jqXHR, textStatus, errorThrown)
        {
            console.log('Ajax call error: '+jqXHR.status+' '+errorThrown)                
        }
    });
}

2 个答案:

答案 0 :(得分:2)

以下是代码中$aR的粗略时间表:

// initialized
$aR = '';

// set to `undefined`, since `ajaxReq` returns nothing
$aR = ajaxReq('POST','../../classes/classController.php',$finalData,'json');

// then, later, when the `ajax` call completes:
$aR = json; 
console.log($aR);  // would do something now

如果您需要对该值执行某些操作,请在success处理程序

中执行此操作
success: function(json, textStatus, jqXHR)
{
  $aR = json;
  doSomethingWith($aR);   
},

或者使用$.ajax()返回的AJAX对象:

function ajaxReq($method,$url,$data,$dataType)
{
  return $.ajax({ ... });
}

// called as
ajaxReq('POST','../../classes/classController.php',$finalData,'json').done(
  function(json) {
    $aR = json;
    // whatever else you want to do
  }
);

答案 1 :(得分:1)

默认情况下,JQuery Ajax会进行异步调用。您尝试在从后端检索数据之前使用数据。在Ajax调用之后,JS解释器不会等待响应并将执行:

$aR = ajaxReq('POST', ....).

功能" ajaxReq"没有任何回报。所以," $ aR"值是"未定义"。

数据稍后将在"成功"检索响应后回调:

success: function(json, textStatus, jqXHR)
{
  $aR = json;
},

回调"成功"将在稍后执行"异步"。

了解同步和异步请求之间的区别:

What is the difference between a synchronous and an asynchronous request? (async=true/false)