jQuery将ajax结果返回到外部变量

时间:2013-05-29 04:04:46

标签: jquery ajax variables

我在使用ajax时遇到了一些问题。

如何将ajax的所有结果分配到外部变量?

我谷歌了,发现了这段代码..

var return_first = (function () {
    var tmp = null;
    $.ajax({
        'async': false,
        'type': "POST",
        'global': false,
        'dataType': 'html',
        'url': "ajax.php?first",
        'data': { 'request': "", 'target': arrange_url, 'method': method_target },
        'success': function (data) {
            tmp = data;
        }
    });
    return tmp;
});

但不适合我...

有人可以说出该代码有什么问题吗?

6 个答案:

答案 0 :(得分:43)

之后缺少逗号
'data': { 'request': "", 'target': 'arrange_url', 'method': 'method_target' }

此外,如果您希望return_first保存匿名函数的结果,则需要进行函数调用:

var return_first = function () {
    var tmp = null;
    $.ajax({
        'async': false,
        'type': "POST",
        'global': false,
        'dataType': 'html',
        'url': "ajax.php?first",
        'data': { 'request': "", 'target': 'arrange_url', 'method': 'method_target' },
        'success': function (data) {
            tmp = data;
        }
    });
    return tmp;
}();

最后注意()

答案 1 :(得分:31)

这就是你需要做的所有事情:

var myVariable;

$.ajax({
    'async': false,
    'type': "POST",
    'global': false,
    'dataType': 'html',
    'url': "ajax.php?first",
    'data': { 'request': "", 'target': 'arrange_url', 'method': 'method_target' },
    'success': function (data) {
        myVariable = data;
    }
});
  

注意:已弃用“async”。见https://xhr.spec.whatwg.org/

答案 2 :(得分:17)

使用'async':false 来防止异步代码是一种不好的做法,

  

主线程上的同步XMLHttpRequest因不推荐使用   它对最终用户的体验产生不利影响。 https://xhr.spec.whatwg.org/

在表面设置async to false修复了很多问题,因为正如其他答案所示,您将数据转换为变量。但是,在等待post数据返回时(由于数据库调用,连接速度慢等等,在某些情况下可能需要几秒钟),其余的Javascript功能(如触发事件,Javascript处理按钮,JQuery转换(如当响应处于挂起状态时,将无法发生手风琴或自动完成(JQuery UI))(如果响应永远不会回来,那么这种情况真的很糟糕,因为您的网站现在已基本冻结)。

试试这个,

var return_first;
function callback(response) {
  return_first = response;
  //use return_first variable here
}

$.ajax({
  'type': "POST",
  'global': false,
  'dataType': 'html',
  'url': "ajax.php?first",
  'data': { 'request': "", 'target': arrange_url, 'method': method_target },
  'success': function(data){
       callback(data);
  },
});

答案 3 :(得分:0)

'async': false说它已贬值。我确实注意到,如果我在ajax成功上运行console.log('test1');,然后在ajax函数之后的普通js中运行console.log('test2');,在test2之前打印test1,所以问题是ajax调用有一个延迟很小,但不会停止其余功能以获得结果。简单来说,该变量尚未设置为“还”,因此您需要延迟下一个函数。

function runPHP(){
    var input = document.getElementById("input1");
    var result = 'failed to run php';

    $.ajax({ url: '/test.php',
        type: 'POST',
        data: {action: 'test'},
        success: function(data) {
            result = data;
        }
    });

    setTimeout(function(){
        console.log(result);
    }, 1000);
}

在test.php上(以防您需要测试此功能)

function test(){
    print 'ran php';
}

if(isset($_POST['action']) && !empty($_POST['action'])) {
    $action = htmlentities($_POST['action']);
    switch($action) {
        case 'test' : test();break;
    }
}

答案 4 :(得分:0)

我这样解决了它:

var return_first = (function () {
        var tmp = $.ajax({
            'type': "POST",
            'dataType': 'html',
            'url': "ajax.php?first",
            'data': { 'request': "", 'target': arrange_url, 'method': 
                    method_target },
            'success': function (data) {
                tmp = data;
            }
        }).done(function(data){
                return data;
        });
      return tmp;
    });
  • 注意“异步”:高级javascript将是异步的。

答案 5 :(得分:0)

因此,这比最初的问题要晚了很长时间,从技术上讲,这并不是如何使用Ajax调用来填充问题所要求的外部变量的直接答案。但是,在研究和响应中,发现在不禁用调用中的异步功能或降低回叫地狱的可能性的情况下,做到这一点非常困难。为此,我的解决方案是使用Axios。使用此功能极大地简化了我对异步调用的使用,从而妨碍了获取数据的方式。

例如,如果我试图通过JS的调用来访问PHP中的会话变量(如用户ID),则可能是一个问题。做这样的事情。

async function getSession() {
 'use strict';
 const getSession = await axios("http:" + url + "auth/" + "getSession");
 log(getSession.data);//test
 return getSession.data;
}

将调用如下所示的PHP函数。

public function getSession() {
 $session = new SessionController();
 $session->Session();
 $sessionObj = new \stdClass();
 $sessionObj->user_id = $_SESSION["user_id"];
 echo json_encode($sessionObj);
}

要使用Axios调用此功能,请执行以下操作。

getSession().then(function (res) {
 log(res);//test
 anyVariable = res;
 anyFunction(res);//set any variable or populate another function waiting for the data
});

在这种情况下,结果将是来自PHP的Json对象。

{"user_id":"1111111-1111-1111-1111-111111111111"}

您既可以直接在Axios调用的响应部分中使用函数,也可以设置变量或调用另一个函数。

Axios调用的正确语法实际上看起来像这样。

getSession().then(function (res) {
 log(res);//test
 anyVariable = res;
 anyFunction(res);//set any variable or populate another function waiting for the data
}).catch(function (error) {
 console.log(error);
});

用于正确的错误处理。

我希望这对遇到这些问题的人有所帮助。是的,我知道从技术上讲这不是直接解决问题的方法,但是鉴于已经提供了答案,我感到有必要提供这种替代解决方案,从而极大地简化了客户端和服务器端的代码。