我在使用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;
});
但不适合我...
有人可以说出该代码有什么问题吗?
答案 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;
});
答案 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);
});
用于正确的错误处理。
我希望这对遇到这些问题的人有所帮助。是的,我知道从技术上讲这不是直接解决问题的方法,但是鉴于已经提供了答案,我感到有必要提供这种替代解决方案,从而极大地简化了客户端和服务器端的代码。