52

我在使用 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;
});

但不适合我..

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

4

7 回答 7

66

你在后面少了一个逗号

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

注意()最后。

于 2013-05-29T04:11:56.223 回答
43

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

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

注意: “异步”的使用已被贬低。请参阅https://xhr.spec.whatwg.org/

于 2013-05-29T04:12:14.533 回答
30

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

主线程上的同步 XMLHttpRequest 已被弃用,因为它会对最终用户的体验产生不利影响。https://xhr.spec.whatwg.org/

从表面上看,将 async 设置为 false 可以解决很多问题,因为正如其他答案所示,您将数据放入变量中。但是,在等待发布数据返回时(在某些情况下,由于数据库调用、连接速度慢等原因,这可能需要几秒钟)你的 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);
  },
});
于 2017-04-14T01:40:29.277 回答
0

'async': false说贬值了。我确实注意到如果我console.log('test1');在 ajax 成功上运行,然后console.log('test2');在 ajax 函数之后的普通 js 中,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;
    }
}
于 2019-05-06T20:41:02.250 回答
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);
});

用于正确的错误处理。

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

于 2020-05-06T19:40:04.503 回答
0

我已经稍微改变了以前的响应,这个解决方案一直对我有用。

function searchlipcutforbrace(cs,id_pff,wt,ofl){
    var params = {
       "cs"  : cs,
       "id"  : id_pff,
       "wt"  : wt,
       "ofl"  : ofl
       }
       
var response = $.ajax({
                    data:  params,
                    url:   'ajax/searchlipcutforbrace.php',
                    async: false,
                    dataType: 'json',
                    success: function (json) {
                        response = json;
                    },
                    type:  'post'
                });    
    return response.responseJSON;
}
于 2021-09-23T07:57:59.947 回答
-1

我通过这样做解决了它:

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;
    });
  • 小心 'async':fale javascript 将是异步的。
于 2020-03-30T09:23:16.147 回答