0

オフラインで使用するために関連ファイルをキャッシュするために cache.manifest を使用している Web ページを開発しています。ただし、実際のインターネット接続があるかどうかを検出できる必要があります。if(!navigator.onLine) はある程度までしか機能しません..実際にはオンラインではないのに、オンラインであると言う傾向があります。そのため、呼び出しが成功した場合は true を返し、そうでない場合は失敗を返す ajax 呼び出しを作成しようとしています。私は 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;
});
}

しかし、私はまだこの迷惑な「未定義」を取得していますが、trueでも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

これにつまずく人のために。遅延メソッドを使用してこれを機能させることができませんでした。

私は単純にbasiscに戻り、思い通りに動作するようにしました。これが私が使用したコードです。

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 に答える