我一直试图将此问题排序2天。但事情似乎并不适合我。
我附加的代码在循环外工作正常但是当我在循环中使用它时,它根本不能按照我想要的方式工作并将空数组记录到控制台中。
不在一边,使用" async:false"在我的ajax请求中使代码正常工作并在控制台中完全输出数组但是你知道使用" async:false"不推荐使用并完全冻结UI,直到请求未完成。
任何其他解决方案,而不是将async设置为false?
for (var i = 0; i <= splittedURLSLength; i++) {
var extracted = extractUsername(splittedURLS[i]);
postData = {'name' : extracted};
ajaxRequest = $.when( $.ajax({
url: "/check",
type: "POST",
data: postData
})).then(function(returnedResponse) {
if (returnedResponse == "1") {
resultsArray.push(extracted);
}
});
}
console.log(resultsArray);
答案 0 :(得分:1)
您遇到的问题是因为您在将resultsArray
填充到AJAX请求中的值之前将其记录到控制台中。以下代码将简要介绍如何使用响应中的数据 -
for (var i = 0; i <= splittedURLSLength; i++) {
var extracted = extractUsername(splittedURLS[i]);
postData = {'name' : extracted};
ajaxRequest = $.when( $.ajax({
url: "/check",
type: "POST",
data: postData
})).then(function(returnedResponse) {
if (returnedResponse == "1") {
resultsArray.push(extracted);
showResults(resultsArray);
}
});
}
function showResults(resultsArray) {
console.log(resultsArray);
//Process your resultsArray as per requirement.
}
答案 1 :(得分:1)
由于AJAX请求是异步的,因此在第一个AJAX请求返回之前,您的console.log将会触发。这就是事件循环在Javascript中的工作方式。
您需要将逻辑移动到成功处理程序中:
for (var i = 0; i <= splittedURLSLength; i++) {
var extracted = extractUsername(splittedURLS[i]);
postData = {'name' : extracted};
ajaxRequest = $.when( $.ajax({
url: "/check",
type: "POST",
data: postData
})).then(function(returnedResponse) {
if (returnedResponse == "1") {
resultsArray.push(extracted);
}
if(i === splittedURLSLength){
console.log(resultsArray);
}
});
答案 2 :(得分:0)
只是另一个想法来解决它......
var resultsArray[]//Global or should be pass to the function...
myIterate(0);
function myIterate(idx){
var i = idx;
if (i < splittedURLS.length){
var extracted = extractUsername(splittedURLS[i]);
postData = {'name' : extracted};
ajaxRequest = $.when( $.ajax({
url: "/check",
type: "POST",
data: postData
})).then(function(returnedResponse) {
if (returnedResponse == "1") {
resultsArray.push(extracted);
myiterate(i++);
}
});
}
}
console.log(resultsArray);