我以前没有遇到过,搜索也没有找到答案。我有一个Ajax调用,它可以插入javascript对象。
var order = checkOrder();
console.log("t1: ", order);
setTimeout(function() {
console.log("t2: ", order.responseText);
console.log("t3: ", order.statusText);
console.log((order.responseText != '') ? order.responseText : order.statusText);
}, 100);
function checkOrder() {
return $.get('SCRIPTPATH', function(data) { return data; });
}
我不知道的奇怪部分是第一个console.log吐出了正确的数据,表明“ order”实际上已设置为正确的对象数据,但是当我尝试访问该数据时,它是未定义的。只有当我将其包装在不小于100的setTimeout函数中时,它才会为这些对象值输出正确的数据。
有人知道为什么会这样吗?再次将order变量设置为第一个console.log输出所有正确的数据,只有它之后的那些数据才会尝试访问未定义的对象值,除非我将它们包装在超时函数中。
控制台中的输出(展开对象,以便您可以看到其中的数据值):
t1: {…}
abort: function abort()
always: function always()
catch: function catch()
done: function add()
fail: function add()
getAllResponseHeaders: function getAllResponseHeaders()
getResponseHeader: function getResponseHeader()
overrideMimeType: function overrideMimeType()
pipe: function pipe()
progress: function add()
promise: function promise()
readyState: 4
responseText: "OK"
setRequestHeader: function setRequestHeader()
state: function state()
status: 200
statusCode: function statusCode()
statusText: "OK"
then: function then()
<prototype>: Object { … }
t2: undefined
t3: undefined
undefined
checkOrder函数使用jQuery $ .get(),我检查了其余代码中的ajaxSubmitComplete或类似内容,但没有类似的内容。 1/10秒的延迟并不是什么大问题,但不喜欢必须将所有后续代码包装在超时函数中的想法。
基于mgarcia的回答,这里是更新的代码似乎有效(确定是成功的服务器脚本给出的响应):
checkOrder().then(function(order) {
if(order == "OK") {
//proceed with order
}
else {
//something went wrong
}
});
function checkOrder() {
return $.get('SCRIPTPATH', function(data) { return data; });
}
答案 0 :(得分:2)
ajax是异步的。您遇到了争用情况,其中set timeout正在工作(现在),因为您的ajax在timeout超时之前返回。如果您的服务器端通话花费了更长的时间,它将无法正常工作(所有内容仍然不确定)
您可以编写一个处理来自ajax的响应,并将其传递给ajax调用的函数,而不仅仅是返回数据并依靠它在下一行中可用。
function handleData = function(order) {
console.log("t2: ", order.responseText);
console.log("t3: ", order.statusText);
console.log((order.responseText != '') ? order.responseText : order.statusText);
}
function checkOrder() {
return $.get('SCRIPTPATH', handleData);
}
答案 1 :(得分:1)
您的 checkOrder 方法返回一个Promise。您应该等待该承诺解决:
checkOrder().then(function(order) {
// I'm assuming here that your checkOrder method returns the data once it has resolved so that you have the order object available.
});