Javascript JQuery异步成功
我在一个函数中有以下逻辑,该函数需要根据从ajax调用返回的数据返回一个值,但是,我需要在函数成功后进行处理Javascript JQuery异步成功,javascript,jquery,ajax,asynchronous,Javascript,Jquery,Ajax,Asynchronous,我在一个函数中有以下逻辑,该函数需要根据从ajax调用返回的数据返回一个值,但是,我需要在函数成功后进行处理 var result; console.log("First"); $.ajax ({ dataType: "jsonp", url: url, async: false, success: function(data) { result = data; console.log("Result: " + result);
var result;
console.log("First");
$.ajax ({
dataType: "jsonp",
url: url,
async: false,
success: function(data) {
result = data;
console.log("Result: " + result);
console.log("Second");
},
error: function(err) {
console.log(JSON.stringify(err))
}
});
console.log("Third");
console.log("Data: " + result);
我希望在控制台中看到以下内容
首先
结果:[对象]
第二
第三
数据:[对象]
但是,我在控制台中看到以下内容
弗斯特
第三
数据:未定义
结果:[对象]
第二
看起来它实际上是异步执行的,或者说是在需要调用success函数时异步执行的
var result;
console.log("First");
$.ajax ({
dataType: "jsonp",
url: url,
async: false,
success: function(data) {
result = data;
console.log("Result: " + result);
console.log("Second");
},
error: function(err) {
console.log(JSON.stringify(err))
}
});
console.log("Third");
console.log("Data: " + result);
我已经尝试通过添加async:false使其不异步。是否有一种方法可以让ajax调用后的代码在成功函数执行后执行。我想根据返回给包含此ajax调用的函数的数据返回一个布尔值
查看论坛,我可以发现类似的情况,但他们没有问我关于在ajax调用和成功函数之后执行代码的具体问题。您需要使用在成功回调结束时调用的函数。例如:
var result;
console.log("First");
$.ajax ({
dataType: "jsonp",
url: url,
async: false,
success: function(data) {
result = data;
console.log("Result: " + result);
console.log("Second");
},
error: function(err) {
console.log(JSON.stringify(err))
}
});
console.log("Third");
console.log("Data: " + result);
var result;
console.log("First");
$.ajax ({
dataType: "jsonp",
url: url,
async: false,
success: function(data) {
result = data;
console.log("Result: " + result);
console.log("Second");
afterSuccess();
},
error: function(err) {
console.log(JSON.stringify(err))
}
});
var afterSuccess = function() {
console.log("Third");
console.log("Data: " + result);
};
注意,最好不要使用范围更大的
result
变量,而是将结果作为参数传递给afterSuccess
,数据类型jsonp不支持异步:false
跨域请求和数据类型:“jsonp”请求不支持同步操作
现在您知道了,解决这个问题应该很容易。不要回答您的问题,因为异步函数无法解决这个问题。这就是异步的意思。依赖于结果的所有操作都必须在回调函数中完成,而不是在回调函数之后。@Barmar我认为
async:false
会阻止I/o,直到请求完成。这是真的。但是他的问题是如何在不使用async:false
@Barmar:他在哪里问不使用async:false
怎么做。他还说“我尝试添加async:false”,我解释为这不是他试图运行的实际代码的一部分。如果它更干净,请这样做。但这不是这个问题的重点。我们可以继续讨论“更干净”的事情,比如从不尝试使用同步ajax请求你不是在做一个同步的JSONP请求吗?啊,这显然是个问题。非常感谢。