我正在开发一个使用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()时)
答案 0 :(得分:0)
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;
}