尝试创建检查连接的功能

时间:2013-07-26 06:48:15

标签: jquery ajax

我正在开发一个使用cache.manifest来缓存相关文件以供离线使用的网页。 但是,我需要能够检测是否存在实际的互联网连接。 如果(!navigator.onLine)只能在一定程度上起作用......当它实际上不是时,它倾向于说它在线。 因此,我试图创建一个ajax调用,如果调用成功则返回true,否则返回失败。 我不是jQuery的高手,但这是我到目前为止所拥有的。我尝试了很多替代方案,但我总是得到一个“未定义”的回报。

function checkIfOnline() {
var returned = true;
$.get('services/getObjects.ashx',
        {
            "get": "heartbeat",
            "hash": userHash,
            "uid": uid,
            "gid": gid
        },
        function (data) {
            if(data.result === "Success") {
                alert("Success");
            }
            console.log(data.result);
        },
        "json"
    )
.done(function () {alert("done");
                   returned = true;
                   return returned;})
.fail(function () {alert("fail");
                       returned = false;
                       return returned;});

}

那里的任何人都可以看到我做错了什么? 警报全部显示他们应该...我得到“成功”警报,然后“完成”或“失败”取决于连接。

更新

根据指出的线程,我对我的代码进行了以下更改

function checkIfOnline() {
    return $.ajax({
    type: 'GET',
        url: 'services/getObjects.ashx',
        data:
        {
            "get": "heartbeat",
            "hash": userHash,
            "uid": uid,
            "gid": gid
        }
    });
}

function getOnlineStatus() {
checkIfOnline().done(function(result) {
    alert("done - "+result.result);
    return true;
}).fail(function() {
    alert("failed");
    return false;
});
}

但是我仍然觉得这个烦人的“未定义”,但既不是真的也不是假的(当调用getOnlineStatus()时)

2 个答案:

答案 0 :(得分:0)

你回错了。而不是从完成和失败函数返回它,而是从get调用之外返回值。

function checkIfOnline() {
var returned = true;
$.get('services/getObjects.ashx',
        {
            "get": "heartbeat",
            "hash": userHash,
            "uid": uid,
            "gid": gid
        },
        function (data) {
            if(data.result === "Success") {
                alert("Success");
            }
            console.log(data.result);
        },
        "json"
    )
.done(function () {alert("done");
    returned = true;
})
.fail(function () {alert("fail");
    returned = false;
});

return returned;
}

<强>更新

上述答案并不完全正确。正确的实现是使用此answer

中提到的延迟对象
function foo() {
    return $.ajax(...);
}

foo().done(function(result) {
    // code depending on result
}).fail(function() {
    // an error occurred
});

答案 1 :(得分:0)

对于那些痴迷于此的人。 我无法使用延迟方法使其工作。

我只是回到了基础并让它按照我想要的方式工作。 这是我使用的代码。

function checkIfOnline() {
var response = false;
$.ajax({
    type: 'GET',
    url: 'services/getObjects.ashx',
    async: false,
    data:
        {
            "get": "heartbeat",
            "hash": userHash,
            "uid": uid,
            "gid": gid
        },
    success: function(data) {
        if(data.result === "Success") {
            response = true;
            }
        }
    });
return response;
}