Javascript 访问对象需要设置超时?

Javascript 访问对象需要设置超时?,javascript,jquery,Javascript,Jquery,我以前从未遇到过这种情况,搜索也不会给出答案。我有一个ajax调用,可以将其拉入javascript对象 var order = checkOrder(); console.log("t1: ", order); setTimeout(function() { console.log("t2: ", order.responseText); console.log("t3: ", order.statusText); console.log((order.response

我以前从未遇到过这种情况,搜索也不会给出答案。我有一个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; });
}
我无法理解的奇怪部分是,first console.log吐出正确的数据,表明“order”实际上设置为正确的项目数据,但当我尝试访问数据时,它是未定义的。只有当我将它包装在不小于100的setTimeout函数中时,它才会输出这些对象值的正确数据

有人知道为什么会这样吗?同样,order变量被设置为第一个console.log输出所有正确的数据,只有在这之后的数据才会尝试访问未定义的对象值,除非我将它们包装在超时函数中

控制台中的输出(展开对象以便可以看到数据值):

您的checkOrder方法返回一个承诺。您应该等待该承诺解决:

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.
});

ajax是异步的。您已经得到了一个竞争条件,其中set timeout正在工作(现在),因为您的ajax正在超时之前返回。如果您的服务器端调用花费更长的时间,它将无法工作(EverythSign仍然是未定义的)

您可以编写一个函数来处理来自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);
}

谢谢,这是令人困惑的部分。如果我在等待服务器完成某些操作,为什么order变量设置了正确的数据,但试图访问该变量中的对象值却没有定义?如果我在等待某件事情完成,那么初始顺序变量不是也未定义吗?Javascript仍然是自顶向下执行的,因此如果变量具有正确的数据,那么对该变量中的对象值的后续请求也应该存在。几乎就好像它设置了变量…删除了数据…然后在AJAX完成后重置了变量?谢谢:),这似乎效果最好,尽管每次我不得不使用它时都很笨重
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.
});
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);
}