访问对象需要setTimeout吗?

时间:2019-04-04 13:53:47

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

2 个答案:

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