我有一个调用函数的for循环。在该函数中,我有一个AJAX调用。在ajax完成后,它返回一个值给for循环。那么只有循环必须继续。
for ( var j = 0; j < req.questionId.length; j++) {
var getanswer = getAnswers();
}
function getAnswers(){
$.getJSON("getAnswers?question_id="+questionId,function(data){
return "success";
});
}
答案 0 :(得分:3)
jQuery getJSON调用是异步的,这意味着调用是在后台执行的。所以你立即调用$ .getJSON返回。
你必须为getJSON提供一个“ready-function”(参见文档),这是在返回AJAX调用时调用的。
或者(虽然我会反对它),你可以强制jQuery进行同步AJAX调用,它会在继续之前等待回复。查看jQuery文档。
HTH
答案 1 :(得分:1)
您需要使用$.ajax()
同步拨打电话,如下所示:
for ( var j = 0; j < req.questionId.length; j++) {
var getanswer = getAnswers();
}
function getAnswers(){
var result;
$.ajax({
url: "getAnswers?question_id="+questionId,
dataType: 'json',
async: false,
success: function(data) {
result="success";
}
});
return result;
}
答案 2 :(得分:1)
您的AJAX函数是异步运行的,因此它们不会中断您的JavaScript代码流。这意味着他们发送请求,然后等待响应并处理您在success
函数中放置的任何内容。一直以来,其余代码都在继续运行。
你最好的选择是可能来接受你在for
循环中返回的AJAX所做的一切,并将其传递给你的AJAX查询的success
参数,像这样:
$.getJSON("getAnswers?question_id="+questionId,function(data){
... handle data, parse it, write to page etc ...
});
可以使用不同的调用语法以同步方式运行AJAX,但即使从这里开始,您也很难从中获取return
:
$.ajax({
dataType: "json",
url: url,
data: data,
success: success,
async: false
});
在不了解您的代码以及您正在使用返回的内容的情况下,我无法确定您应如何处理此问题,但是在您执行此操作的方式中,有99次运行AJAX请求软件工程很差。
答案 3 :(得分:0)
您需要使ajax调用同步才能使用它。使用以下代码:
$.ajaxSetup({
async: false
});
答案 4 :(得分:0)
我认为您正在寻找的是同步通话。在这里查看答案:getJSON Synchronous
默认情况下,getJSON以异步方式执行,这意味着代码执行会继续,而不会等待响应。
答案 5 :(得分:0)
由于$.getJSON
是异步的,我认为你需要采用另一种方法。
这样的事情:
for (var j = 0; j < req.questionId.length; j++) {
var getanswer = getAnswers();
}
function getAnswers() {
var ret = false;
$.ajax({
url: "getAnswers?question_id=" + questionId,
dataType: 'json',
async: false,
success: function (data) {
ret = "success";
}
});
return ret;
}
这样你就迫使jQuery同步运行你的请求代码。
答案 6 :(得分:0)
解决方案的抽象实现看起来像
getAnswers(array, complete) {
if (array.length == 0) {
complete();
}
var questionId = array.shift()
$.getJSON("getAnswers?question_id=" + questionId, function (data) {
//do what ever you want to do with data
//call the next question
processQuestions(array, complete)
});
}
getAnswers(req.questionId, function(){
//do something when all questions are completed
})
答案 7 :(得分:0)
要使用for循环,您需要使调用同步,这不是一个好习惯,因为看起来您的页面在请求期间被挂起。
而是使用递归函数,在异步调用完成后调用成功回调函数。
// declare in global
var req.questionId = "";
var index = 0;
// declare your recursive function call
function recursiveFunction()
{
if(index > req.questionId) return false;
// call your ajax here using global index variable
}
// your ajax function call
function ajaxCall
{
$.ajax({
url: "getAnswers?question_id=" + questionId,
dataType: 'json',
success: function (data) {
ret = "success";
// call your recursive function here
recursiveFunction();
}
});
}
现在ajax调用是异步的,for循环是通过递归调用实现的。
希望有所帮助。