0

我正在开发一个使用 cache.manifest 缓存相关文件以供离线使用的网页。但是,我需要能够检测是否有实际的互联网连接。if(!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() 时)

4

2 回答 2

0

你把它退回错了。而不是从 done 和 fail 函数返回它,而是从 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;
}

更新:

上面的答案并不完全正确。正确的实现是使用这个答案中提到的延迟对象

function foo() {
    return $.ajax(...);
}

foo().done(function(result) {
    // code depending on result
}).fail(function() {
    // an error occurred
});
于 2013-07-26T07:10:41.177 回答
0

对于那些偶然发现这一点的人。我无法使用延迟方法让它工作。

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

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;
}
于 2013-07-26T12:38:59.973 回答