我的ajax.done中有数据,并且它在jquery上有bug。 我用Google搜索,无法找到任何东西。
该怎么办?
function select_aragement(arragament){
var arrst = arragament;
var arrsplit = arrst.split("|");
var periode = arrsplit[0];
var id = arrsplit[1];
var postsjson;
var test= $.ajax({
type: 'POST',
async: true,
url: 'ajax/prijzen.php',
data: { id: id, periode: periode },
dataType: 'json'
}).done(function (vis) {
console.log(vis);
postsjson = $.parseJSON(vis);
});
return postsjson;
}
答案 0 :(得分:1)
您不应该尝试从回调函数返回任何内容,因为返回的值不会有任何意义。相反,您只需使用来自该回调函数内的AJAX请求的响应。
假设你有这段代码:
function bar() {
var myObject = foo();
// do something with myObject
}
function foo() {
var bar; // 1
var xhr = $.ajax({
url: yourUrl,
dataType: 'json',
type: 'post',
data: {
some: 'data'
}
}); // 2
xhr.done(function(yourObject) {
bar = yourObject; // 5
}); // 3
return bar; // 4
}
bar();
foo
函数内的注释表示这些语句的执行顺序。因此,您声明一个变量bar
,声明一个具有Deferred对象的变量xhr
,使用回调函数为其附加done
处理程序,返回值bar
, 然后 bar
的值已设置(太迟了 - 您已经尝试将其返回)。
执行bar
函数myObject
的内部将是未定义的,因为bar
函数中foo
的值未在返回之前设置声明。您需要做的只是将// do something with myObject
代码移动到回调函数,然后在那里使用bar
:
function foo() {
var xhr = $.ajax({
url: yourUrl,
dataType: 'json',
type: 'post',
data: {
some: 'data'
}
}); // 1
xhr.done(function(yourObject) {
var bar = yourObject; // 4
// do something with bar
}); // 2
// 3 - function execution has finished
}
答案 1 :(得分:0)
您可能希望在完成部分内移动返回行
}).done(function (vis) {
console.log(vis);
postsjson = $.parseJSON(vis);
return postsjson;
});
但请记住,作为一个异步电话,你的回归也是如此。我的建议是通过回调。
function select_aragement(arragament, callback){
var arrst = arragament;
var arrsplit = arrst.split("|");
var periode = arrsplit[0];
var id = arrsplit[1];
var postsjson;
var test= $.ajax({
type: 'POST',
async: true,
url: 'ajax/prijzen.php',
data: { id: id, periode: periode },
dataType: 'json'
});
test.done(function (vis) {
console.log(vis);
postsjson = $.parseJSON(vis);
callback && callback(postjson);
});
}
修改代码以使用回调而不是返回的值。
前
var postjson=select_aragement(arragament);
...stuff with postjson...
后
select_aragement(arragament, function(postjson) {
...stuff with postjson...
});
答案 2 :(得分:0)
您正在尝试同步进行ajax调用,因为您需要将async属性设置为false。
async: false,
答案 3 :(得分:0)
问题:
请查看以下代码:
function getValue(){
var value = 0;
setTimeout(function(){
value = 42;
}, 1000);
return value;
}
返回的值是多少?
这是你完全相同的问题
function select_aragement(arragament){
var postjson;
$.ajax(...).done(function(vis){
postjson = vis;
});
return postjson;
}
解决方案:
我想你以下列方式使用你的功能:
var data = select_aragement(arragament);
// do something with data :
$.each(data, function(){
....
});
您可以像这样更改select_aragement
的代码:
function select_aragement(arragament){
var arrst = arragament;
var arrsplit = arrst.split("|");
var periode = arrsplit[0];
var id = arrsplit[1];
var test = $.ajax({
type: 'POST',
async: true,
url: 'ajax/prijzen.php',
data: { id: id, periode: periode },
dataType: 'json'
});
// return the promise which wraps the ajax call
return test;
}
和这样的调用代码:
// "p" stands for "promise"
var p = function select_aragement(arragament);
p.done(function(data){
// do something with data :
$.each(data, function(){
....
});
});
或没有局部变量:
select_aragement(arragament).done(function(data){
// do something with data :
$.each(data, function(){
....
});
});
答案 4 :(得分:0)
在这种情况下,您可以像这样从jQuery使用async / await混合到.done:
async function myasyncfunction(myArgs){
var response = [];
var req = $.ajax({
method: "GET",
url: resquestURL,
dataType: "json",
})
await req.done( res => {
//DO some stuff with your data
for (let index = 0; index < res.length; index++) {
const element = res[index];
response .push( "some stuff" + element );
}
})
return response;
}